在两列

时间:2015-06-18 10:06:15

标签: sql postgresql

我有两列XY以及一条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语法,但它澄清了这个问题。

注意:数字代表状态,这种情况背后没有数学逻辑。

4 个答案:

答案 0 :(得分:9)

如果您不需要在xy上使用索引,最简单的方法可能是:

...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

SQL小提琴:http://sqlfiddle.com/#!15/b57f7/2/0

答案 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)