需要为表中存在的每一行获取真/假

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

【讨论】:

以上是关于需要为表中存在的每一行获取真/假的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以测试并给出真/假语句以查看文件是不是存在,Python [重复]

(VBA)为表中的每条记录创建一个文件“pdf”

从 Access 中的另一个表中获取输入

在检查行是不是已存在时,选择不会从表中获取任何内容

如何为存在的每一行向 Spark 数据框中添加新列?

数据库三大范式