是否有任何 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 constructor(VALUES()
子句)而不是 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
有什么方法可以在 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 constructor(VALUES()
子句)而不是 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