【问题标题】:Case statement with "where in" clause带有“where in”子句的 case 语句
【发布时间】:2013-09-16 00:05:29
【问题描述】:

我有一个场景,如果传递给查询的参数是 99999,我需要在 where 子句中使用多个值,否则我只使用参数本身。我使用“IN”作为 where 子句的一部分,但出现以下错误“关键字'CASE' 附近的语法不正确”。 任何人都提供了一种替代错误查询的方法,可以让我得到我需要的结果?

DECLARE @IPD_NEWS_TYPE_PARAM decimal (18,0)
 SET @IPD_NEWS_TYPE_PARAM = 99999

SELECT 
    n.id,
    n.headline,
    n.news_type_id
FROM news n
WHERE n.news_type_id IN
CASE WHEN @IPD_NEWS_TYPE_PARAM = 99999 THEN (1,2,3,4,5)
ELSE
(@IPD_NEWS_TYPE_PARAM)
END

【问题讨论】:

  • 核心问题是1)(1,2,..)不是一个表达式,因此不能是CASE的结果;并且,支持 2)IN 需要一个固定的元组(不是不可能的表达式) - 因此,它永远不会那样工作。如果问题更复杂(即需要担心除 99999 之外的其他值),请务必同时指出该信息。

标签: sql sql-server tsql case where


【解决方案1】:

也许你想要:

DECLARE @IPD_NEWS_TYPE_PARAM decimal (18,0)
 SET @IPD_NEWS_TYPE_PARAM = 99999

SELECT 
    n.id,
    n.headline,
    n.news_type_id
FROM news n
WHERE (n.news_type_id IN ('1','2','3','4','5') AND @IPD_NEWS_TYPE_PARAM = 99999) 
   OR (n.news_type_id = @IPD_NEWS_TYPE_PARAM AND @IPD_NEWS_TYPE_PARAM <> 99999)

【讨论】:

  • 谢谢,这正是我所需要的。
【解决方案2】:

使用 IF 语句:

DECLARE @IPD_NEWS_TYPE_PARAM decimal (18,0)
 SET @IPD_NEWS_TYPE_PARAM = 99999

IF (@IPD_NEWS_TYPE_PARAM = 99999) 
    SELECT 
        n.id,
        n.headline,
        n.news_type_id
    FROM news n
    WHERE n.news_type_id IN (1,2,3,4,5)
ELSE
    SELECT 
        n.id,
        n.headline,
        n.news_type_id
    FROM news n
    WHERE n.news_type_id = @IPD_NEWS_TYPE_PARAM

【讨论】:

  • 谢谢约翰,我会把这个送给山羊,因为他比你稍微好一点。
【解决方案3】:

您可以使用CASE 表达式返回一个值以供后续测试,例如:

SELECT 
    n.id,
    n.headline,
    n.news_type_id
FROM news n
WHERE CASE
  WHEN @IPD_NEWS_TYPE_PARAM = 99999 THEN
    CASE WHEN n.news_type_id IN (1,2,3,4,5) THEN 1 ELSE 0 END
  WHEN @IPD_NEWS_TYPE_PARAM = n.news_type_id THEN 1
  ELSE 0
  END = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多