Ответ 1
Если вам не нужно использовать индекс на x
или y
, возможно, самый простой способ:
...WHERE ARRAY[x,y] <@ ARRAY[0,1,4,6,7]
У меня есть два столбца 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, но его уточняет вопрос.
Примечание: числа представляют статусы, математическая логика этого условия отсутствует.
Если вам не нужно использовать индекс на x
или y
, возможно, самый простой способ:
...WHERE ARRAY[x,y] <@ ARRAY[0,1,4,6,7]
Вы можете поместить значения в массив и массив в 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);
Используйте 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
Я думаю, что это должно сработать:
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)