如果嵌套查询在 SQL Server 中是不是有结果,如何返回是或否?

Posted

技术标签:

【中文标题】如果嵌套查询在 SQL Server 中是不是有结果,如何返回是或否?【英文标题】:How to return Yes or No if nested query has result or not in SQL Server?如果嵌套查询在 SQL Server 中是否有结果,如何返回是或否? 【发布时间】:2014-10-29 00:34:48 【问题描述】:

我有一个带有嵌套查询的存储过程,它检查主表中的“category”是否与子表中的“category”匹配。 所以可以有一个匹配或没有匹配。

如果有匹配并且子查询返回某些内容,我如何返回 Yes,如果没有匹配并且子查询不返回任何内容,我如何返回 No?

我尝试了以下通常有效的方法,但前提是存在匹配,否则不会返回任何内容。

我的 SQL(缩短):

SELECT      A.categoryID,
            A.category,
            A.[description],
            (
                SELECT      'Yes' AS subscribed
                FROM        MOC_Categories_Subscribers D
                WHERE       D.category = A.category
                FOR XML PATH(''), ELEMENTS, TYPE
            )
FROM        MOC_Categories A

【问题讨论】:

【参考方案1】:

如果子查询没有返回任何行,那么您的结果将为 NULL。因此,您需要检查它。在 SQL Server 中,您可以使用函数 ISNULLCOALESCE 来执行此操作,这取决于您使用的版本

SELECT A.categoryID,
       A.category,
       A.[description],
       COALESCE((SELECT TOP 1 'Yes'
                 FROM MOC_Categories_Subscribers D
                 WHERE D.category = A.category), 'No') AS Result
FROM MOC_Categories A

【讨论】:

太完美了——正是我想要的。非常感谢!【参考方案2】:
SELECT      A.categoryID,
            A.category,
            A.[description],
            (
                SELECT      
                case 
                   when count(subscribed) > 0 then 'Yes'
                   else 'No'
                end
                FROM        MOC_Categories_Subscribers D
                WHERE       D.category = A.category
            )
FROM        MOC_Categories A

【讨论】:

也谢谢你!【参考方案3】:

您可以使用outer join,如果不匹配则返回null 值。结合case 转换为是/否值:

SELECT  A.categoryID,
        A.category,
        A.[description],
        subscribed = CASE
           WHEN D.category IS NOT NULL THEN 'Yes'
           ELSE 'No'
           END,
FROM        MOC_Categories A
LEFT OUTER JOIN MOC_Categories_Subscribers D
   ON D.category = A.category

【讨论】:

在这种情况下,查询的语义会有所不同。如果我们有一个一对多的关联,结果将加倍 是的,但在这种情况下,OP 指定了“一或无”。

以上是关于如果嵌套查询在 SQL Server 中是不是有结果,如何返回是或否?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server IIF 与 CASE

Sql server 未在查询中使用嵌套 case 语句更新记录

通过消除视图简化 SQL Server 查询

SQL 查询执行时间、SQL Server、嵌套查询

sql语句字符串的嵌套问题

SQL Server 查询以根据用户提供的 id 获取嵌套的子记录