我有一些表格
CREATE TABLE some_table(row_id int, id_1 varchar, id_2 varchar, some_value varchar)
列id_1和id_2可以是以下值之一:"a"、"b"、"c"、"d"。
样本数据:
|row_id|id_1 |id_2 |some_value|
| 1 | a | b | abcd |
| 2 | b | c | bcde |
| 3 | d | a | cdef |
| 4 | c | d | def |
| 5 | null| a | efg |
| 6 | b | null| fgh |
| 7 | c | null| ghi |
| 8 | null| d | hik |
| 9 | null| null| ikl |
我想要的结果:
|row_id|id_1 |id_2 |some_value|
| 1 | a | b | abcd |
| 2 | b | c | bcde |
| 3 | d | a | cdef |
| 5 | null| a | efg |
| 6 | b | null| fgh |
我需要选择行,如果:
- id_1='a'或id_1='b'
- 如果id_1不符合条件1,则id_2='a'或id_2='b'我知道我可以使用一些类似的子查询和并集:
WITH a_or_b_values AS(
SELECT *
FROM some_table
WHERE id_1 = 'a' or id_1 = 'b'
or id_2 = 'a' or id_2 = 'b'
),
id_1_values AS (
SELECT *
FROM some_table
WHERE id_1 = 'a' OR id_1 = 'b'
) SELECT *
FROM some_table
WHERE NOT EXISTS(SELECT row_id FROM id_1_values WHERE id_1_values.row_id = a_or_b_values.row_id)
UNION
SELECT * FROM id_1_values;
是否存在更高效/更优雅的解决方案?
附言:我使用Vertica/Postgres数据库,但这个问题更多的是关于逻辑的——任何数据库的解决方案都是可以接受的
如果您想在结果集中一行,您可以使用order by
并获取一行:
select t.*
from t
where id_1 in ('a', 'b') or id_2 in ('a', 'b')
order by (case when id_1 in ('a', 'b') then 1 else 2 end)
offset 1 row fetch first one row only;
编辑:
对于你澄清的问题,我想你只想:
select t.*
from t
where t.id_1 in ('a', 'b') or
t.id_2 in ('a', 'b');