2015-06-18 2 views
11

у меня есть две колонки X и Y и а, где выписки, как следующее:Проверить же долго состояние на двух колоннах

WHERE (x=0 or x=1 or x=4 or x=6 or x=7 or x=12 or x=75) and 
     (y=0 or y=1 or y=4 or y=6 or y=7 or y=12 or y=75) 

, так как это то же самое состояние на обоих столбцах той же самой таблицы есть способ Короче это ?

Что-то вроде x and y are (0 or 1 or 4....) - это не синтаксис PostgreSQL, но его уточнение вопроса.

Примечание: номера представляют собой статусы, нет математической логики этого условия.

+0

@SQLPolice Я согласен, у меня есть теги с возвратом , теперь мы должны удалять комментарии, чтобы избежать путаницы с будущими читателями. – Matt

ответ

9

При условии, что вам не нужно его использовать индекс на x или y, самым простым способом вероятно:

...WHERE ARRAY[x,y] <@ ARRAY[0,1,4,6,7] 
+0

Лучший и самый чистый ответ – Matt

4

Использование IN

SELECT * 
FROM yourtable 
WHERE x IN (0, 1, 4, 6, 7, 12, 75) 
AND y IN (0, 1, 4, 6, 7, 12, 75) 

данные:

x y 
0 0 
1 1 
4 4 
6 6 
7 7 
12 12 
75 75 

Выход:

x y 
0 0 
1 1 
4 4 
6 6 
7 7 
12 12 
75 75 

SQL Скрипка: http://sqlfiddle.com/#!15/5f0f5/1/0

С Nulls в данном:

x  y 
0  0 
1  1 
4  null 
6  6 
null 7 
12 12 
75 75 

адаптированный код, поскольку они больше не являются целыми числами:

SELECT * 
FROM yourtable 
WHERE x IN ('0', '1', '4', '6', '7', '12', '75') 
AND y IN ('0', '1', '4', '6', '7', '12', '75') 

Выход:

x y 
0 0 
1 1 
6 6 
12 12 
75 75 

SQL Скрипки: http://sqlfiddle.com/#!15/b57f7/2/0

+0

@a_horse_with_no_name. Второй работает только при одном значении. 'WHERE 1 IN (x, y)'? – Matt

+0

Да. Или если вы сравниваете кортежи: '(x, y) IN ((0,0), (1,1), (4,4), ...)' будет работать –

+0

@a_horse_with_no_name спасибо, отредактировал anwer – Matt

6

Вы можете поместить значения в массив а массив в CTE.

Предполагая существование tablename(x int, y int):

with list(arr) as (select array[0,1,4,6,7]) 
select x,y from list,tablename where x=any(arr) and y=any(arr); 
+0

это дает 'ERROR: столбец" arr "не существует'. – John

+0

Это работает для меня. См. Sqlfiddle по адресу http://sqlfiddle.com/#!15/5aeaa/1 –

+0

Да, исправлено, спасибо. –

1

Я думаю, что это должно работать:

WITH vals AS (
    SELECT * 
    FROM (VALUES (0),(1), (4),(6),(7),(12),(75)) AS vi(v) 
) 
SELECT * 
FROM t 
WHERE EXISTS(SELECT 1 FROM vals v1 CROSS JOIN vals v2 WHERE v1.v = x AND v2.v = y) 
Смежные вопросы