是否有任何 SQL 功能或方法可以做到这一点?

Is there any SQL function or way to do this?

有什么方法可以在 SQL 中做到这一点?

Les 说我有 table Tablename_1 如下:

id col1
1 data1
2 data2
3 data3
4 data4
5 data5

我想检查我在 where 子句中的数据是否存在于 table 中 例如,where 子句为:

where id in (1,3,5,7);

那么我希望输出如下:

id data_result
1 YES
3 YES
5 YES
7 NO

有几种方法可以做到这一点。

一种选择是将您的 ID 作为 table-valued constructorVALUES() 子句)而不是 WHERE 子句提供。然后你可以从这个新的“table”左加入来创建你的结果。

这是MySql版本(Postgresql需要去掉row关键字):

select a.n, case when t1.id IS NULL then 'N' else 'Y' end as data_result
from (values row(1), row(3),row(5),row(7)) as a(n)
left join tablename_1 t1 on a.n = t1.id

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=028e5a984e5ed2969247e025bc8776be

您也可以通过 UNION 在 CTE 中执行此操作:

WITH base as (
    SELECT 1 as n UNION SELECT 3 UNION SELECT 5 UNION SELECT 7
)
SELECT base.n, case when t1.id IS NULL then 'N' else 'Y' end as data_result
FROM base
LEFT JOIN tablename_1 t1 on base.n = t1.id

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ef2a88f6f89bf4101d7d651b4440ac28

这在两个数据库中的工作原理相同,但如您所见,这意味着要为列表中的每个值构建更多代码。

最后一个选项是创建 dynamic numbers table。然后你可以再次 LEFT JOIN 这些 table 一起找出动态 table 中所有可能值的 Yes/No 结果,然后仍然将你想要的值放在 WHERE 子句中以仅显示那些结果。这里的诀窍是它要求您预先了解您的值的可能范围,如果您的猜测太远,可能会使事情变慢一些。

也可以使用 EXISTS() 子句编写其中的任何一个,这通常可以表现得更好。我只是觉得 JOIN 更容易编写和推理。

您还可以将 exists 与 Joel 的价值观方法结合使用

类似

select v.*,
case when exists(select 1 from Tablename_1 as t where t.id=v.id) then 
    'Yes' 
else    
    'No' 
end 
from (values (1),(3),(5),(7)) as v(id)

您可以使用任何一个。

select Tablename_1.id, 
       case 
            when Tablename_1.id = ANY (ARRAY[1, 3,5,7]) 
            then 'YES' 
            else 'NO' end  
           as data_result 
from Tablename_1;

进一步阅读:IN vs ANY operator in PostgreSQL