我的SQL查询包含WHERE
条款看起来像这样:如何在WHERE子句中使用两次相同的列表?
WHERE
name1 in ('Emily', 'Jack', 'James', 'Chloe')
OR name2 in ('Emily', 'Jack', 'James', 'Chloe')
需要注意的是相同的列表出现了两次,这是相当不令人满意的(和我真正的名单实际上较长)。
什么是更好的方式来写这个查询?
我的SQL查询包含WHERE
条款看起来像这样:如何在WHERE子句中使用两次相同的列表?
WHERE
name1 in ('Emily', 'Jack', 'James', 'Chloe')
OR name2 in ('Emily', 'Jack', 'James', 'Chloe')
需要注意的是相同的列表出现了两次,这是相当不令人满意的(和我真正的名单实际上较长)。
什么是更好的方式来写这个查询?
您可以使用数组和overlap operator &&
,例如:
with my_table(name1, name2) as (
values ('Emily', 'Bob'), ('Ben', 'Jack'), ('Bob', 'Ben')
)
select *
from my_table
where array[name1, name2] && array['Emily', 'Jack', 'James', 'Chloe'];
name1 | name2
-------+-------
Emily | Bob
Ben | Jack
(2 rows)
使用公用表表达式:
with to_check (name) as (
values ('Emily'), ('Jack'), ('James'), ('Chloe')
)
select ...
from ...
WHERE name1 in (select name from to_check)
OR name2 in (select name from to_check);
一种方法是正则表达式:
WHERE (name1 || ' ' || name2) ~ 'Emily|Jack|James|Chloe'
这不正是的相同的逻辑(命名为“艾米丽·多伊”将匹配该逻辑但不是第一个),但它可能会做你想做的。
这将是更好的存储'name1'并在不同的行'name2'(另一个表)。 –
当然会,但我没有设计数据库。我只有一个只读访问权限。 – Scarabee