首页 > 解决方案 > SQL 中带有条件的子查询

问题描述

我正在尝试查询连接列为 0 的输入,它应该对 where 使用不同的条件。

原始查询

Select * from dbo.Q
WHERE TX IN (SELECT TX FROM DBO.SM WHERE SITE_ID in (SELECT PSITE_ID FROM SITES WHERE SITE_NUMBER = @site_number)

如果 Psite_id 为 0 或 NULL,我希望子查询在子查询中使用 ASite_id 而不是 Psite_id。我尝试使用案例,但它给了我如下错误:

Select * from dbo.Q
WHERE TX IN (SELECT TX FROM DBO.SM WHERE SM.SITE_ID in (case when (SELECT PSITE_ID FROM SITES WHERE SITE_NUMBER = @site_number)=0 then SELECT ASITE_ID FROM SITES WHERE SITE_NUMBER = @site_number ))

我可以加入,但我仍然不太确定如何解决这个问题?

标签: sql

解决方案


Case的语法必须包括以下部分:

Case When <condition> Then <value> else <value> End

因此,如果我很好地了解您的需求,那么它应该可以工作:

Select * 
From dbo.Q 
Where TX IN (Select TX 
             From DBO.SM 
             Where SITE_ID IN 
                        (Select Case When IsNull(PSITE_ID, 0) = 0 
                                     Then ASITE_ID Else PSITE_ID End
                         From SITES 
                         Where SITE_NUMBER = @site_number))

根据您使用的 SQL 服务器类型(您未指定),IsNull() 函数可能不存在。例如,在 Oracle 中,您必须使用 NVL() 而不是 IsNull()。


推荐阅读