Проверьте одинаковое длительное состояние на двух столбцах

У меня есть два столбца X и Y и оператор where:

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, но его уточняет вопрос.

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

Ответ 1

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

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

Ответ 2

Вы можете поместить значения в массив и массив в 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);

Ответ 3

Используйте 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 Fiddle: 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 Fiddle: http://sqlfiddle.com/#!15/b57f7/2/0

Ответ 4

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

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)