我有两列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语法,但它澄清了这个问题。
注意:数字代表状态,这种情况背后没有数学逻辑。
答案 0 :(得分:9)
如果您不需要在x
或y
上使用索引,最简单的方法可能是:
...WHERE ARRAY[x,y] <@ ARRAY[0,1,4,6,7]
答案 1 :(得分: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);
答案 2 :(得分: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
数据中包含Null:
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
答案 3 :(得分: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)