需要为表中存在的每一行获取真/假
Posted
技术标签:
【中文标题】需要为表中存在的每一行获取真/假【英文标题】:Need to get true/false for each row that exists in table 【发布时间】:2018-03-13 07:09:54 【问题描述】:。
我的确切问题是我们如何将 EXISTS 与 IN 子句一起使用。
例如: Select exists(select 1 from table_name where table_column in ('xyz','abc'))。
即使其中一行存在,它也会返回 TRUE。我需要一个列,如果存在一行,则为 TRUE,如果不存在,则为 FALSE。仅在“IN”运算符中指定的值的状态。
预期输出:
存在
FALSE //xyz 不存在于表中
TRUE //abc 存在于表中
【问题讨论】:
【参考方案1】:这应该可行,将返回一个结果,TRUE 或 FALSE
SELECT IF(COUNT(*)>0,TRUE,FALSE) as `Exists`
FROM table_name
WHERE table_column in ('xyz','abc')
;
【讨论】:
【参考方案2】:您可以尝试使用CASE
表达式:
SELECT
'xyz' AS item,
CASE WHEN EXISTS(SELECT 1 FROM table_name WHERE table_column = 'xyz')
THEN 'true' ELSE 'false' END AS `exists`
FROM dual
UNION ALL
SELECT
'abc',
CASE WHEN EXISTS(SELECT 1 FROM table_name WHERE table_column = 'abc')
THEN 'true' ELSE 'false' END
FROM dual;
【讨论】:
但这给出了完整的行数,我需要包含我们在 IN 子句中使用的那两行的状态的布尔列,即使我们删除 *,它仍然给出布尔列但对于表中的所有行。顺便说一句,感谢您的回答帮助我现在处理 CASE。谢谢。 @ShivaSagar 编辑您的问题并显示您的 exact 预期输出。不要用文字描述。 完成。@TimBiegeleisen 试试我更新的查询;只需将当前的EXISTS
子句放入 CASE
表达式即可。
如果两个值中的任何一个存在,则给出 一个 TRUE,如果表中都不存在,则给出 一个 FALSE【参考方案3】:
您可以使用 DUAL 和 UNION 与要输出的元素('abc' 和 'xyz')组成一个选择。此时,您可以在之前的选择和实际表之间进行左外连接。如果表中缺少一个元素,则结果集上的属性 t.table_column 将为 NULL(因为外部连接)。然后,您可以使用 case 表达式测试该值,这样您就可以得到每个元素的答案。
您的查询可能如下所示:
SELECT DISTINCT a.table_column,
CASE WHEN t.table_column IS NULL
THEN 'FALSE'
ELSE 'TRUE' END
AS exist_column
FROM (SELECT 'xyz' AS table_column FROM DUAL
UNION
SELECT 'abc' FROM DUAL) a
LEFT OUTER JOIN table_name t
ON t.table_column = a.table_column
【讨论】:
以上是关于需要为表中存在的每一行获取真/假的主要内容,如果未能解决你的问题,请参考以下文章