将WHERE子句的优先级设置为2列



我有一些表格

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     |    

我需要选择行,如果:

  1. id_1='a'或id_1='b'
  2. 如果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');

相关内容

  • 没有找到相关文章

最新更新