是否可以与 SQL 中的另外两个字段共享相同的过滤器参数(WHERE CLAUSE)?

Posted

技术标签:

【中文标题】是否可以与 SQL 中的另外两个字段共享相同的过滤器参数(WHERE CLAUSE)?【英文标题】:Is it possible to share the same filter parameters (WHERE CLAUSE) with two more fields in SQL? 【发布时间】:2021-09-09 18:17:05 【问题描述】:

考虑下面

SELECT * FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
WHERE 
t1.A NOT IN ('111111','222222','33333')
AND 
t2.B NOT IN ('111111','222222','33333')

还有其他方法可以为两个不同的字段使用相同的过滤器参数吗?

类似的东西

SELECT * FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
WHERE (t1.A and t2.B) NOT IN ('111111','222222','33333')

看起来很简单,但我在文档中找不到任何内容。

【问题讨论】:

【参考方案1】:

CTE 是一种可能性。

WITH cte
AS
(
SELECT c
       FROM (VALUES ('111111'),
                    ('222222'),
                    ('33333')) v
                               (c)
)
SELECT *
       FROM table1 t1
            LEFT JOIN table2 t2
                      ON t1.id = t2.id
       WHERE t1.a NOT IN (SELECT c
                                 FROM cte)
             AND t2.c NOT IN (SELECT c
                                     FROM cte);

【讨论】:

【参考方案2】:

您可以使用数组交集运算符 (&&) 来模拟该条件 - 创建列数组和要测试的值数组,并使用 where 子句检查它们之间是否存在交集:

SELECT    * 
FROM      table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
WHERE     NOT ARRAY[t1.A, t2.B] && ARRAY['111111', '222222', '33333']

【讨论】:

@mateusvl 。 . .这还有一个好处是可以将单个数组作为参数传递给查询,并且数组可以有任意数量的元素。

以上是关于是否可以与 SQL 中的另外两个字段共享相同的过滤器参数(WHERE CLAUSE)?的主要内容,如果未能解决你的问题,请参考以下文章

sql 如何过滤重复记录

SQL中同一个表中,一个字段里面的值等于 另外一个表里面的值 例如表ABC 字段D里面的值如何更新到字段E里面

sql server 触发器 从一个表添加到另个表是否两个表对应的字段必须相同呢

请教怎么用SQL对比两个表中身份证号字段不一样的数据

根据 AS400 SQL 中的不同条件更新 SQL 中的相同字段

如何删除sql中某个字段出现重复的数据,且只保留id最小的