【问题标题】:SQL Server Where Clause Case Statement?SQL Server Where 子句案例语句?
【发布时间】:2009-11-02 21:21:50
【问题描述】:

我有一个 Where 子句可以检查子查询中是否存在行,但我只想执行该检查是否某个位设置为 1。例如:

Select * from Listing l
Where
l.IsDeleted=1 
AND CASE WHEN @MustHasPicture = 1  THEN 
(
    EXISTS
    (
        SELECT NULL AS [EMPTY]
        FROM [dbo].[ListingPictures] AS [lp]
        INNER JOIN Listing l ON lp.ListingID=l.ID
    )
)
ELSE 1 END = 1

这个语法是错误的,我希望有人能指出我正确的方向。谢谢。

【问题讨论】:

  • 你想对查询做什么?
  • 如果用户传入@MustHavePicture=1,那么我只想返回有图片的列表。如果用户传入@MustHavePicture=0,那么无论是否有图片,我都想返回所有列表

标签: sql sql-server tsql case


【解决方案1】:
SELECT * 
  FROM Listing l
 WHERE IsDeleted = 1 
   AND ( @MustHasPicture <> 1 OR 
         (@MustHasPicture = 1 AND l.id IN (
              SELECT listingid
              FROM ListingPictures
            )
         )
       )

【讨论】:

  • 这会导致在两种情况下返回相同的列表。因此,当@MustHavePicture=1 时,将返回非图片列表。不过,它对我来说似乎是最好的候选人......:(
  • 这就是我没有真正测试的结果。编辑为使用我还没有测试过的另一种方法:-P
  • 糟糕,我的错。 Exists 子查询需要使用 Where 子句而不是内部连接。清单 l 最终成为另一个别名,而不是使用上一层的别名。因此,子查询总是返回 true,这就是抛出结果的原因。
【解决方案2】:

无需做case——如果and的第一部分失败,第二部分将不会被执行。

select
  *
from
  Listing l
Where
 l.IsDeleted = 1
 and ((@MustHasPicture = 1 and exists (...)) or 1)

【讨论】:

  • 这会导致语法错误“在预期条件的上下文中指定的非布尔类型的表达式,靠近 ')'。”最后取出“OR 1”使其编译,但如果用户传入@MustHavePicture=0,它不会返回任何列表
【解决方案3】:

这个呢:

SELECT * FROM Listing l 
WHERE l.IsDeleted = 1 
AND (@MustHasPicture = 1 
    AND EXISTS(SELECT * FROM [dbo].[ListingPictures] AS [lp]  
    WHERE lp.ListingID = l.ID) 
OR @MustHasPicture = 0)

但是@MustHasPicture 的值从何而来?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多