【问题标题】:CASE statement in WHERE clause : TeradataWHERE 子句中的 CASE 语句:Teradata
【发布时间】:2017-04-01 22:39:05
【问题描述】:

下面粘贴的是一个示例 SQL 代码,它在 where 子句中使用了 case 语句,但它抛出了一个语法错误,说“在 mrktng_pckge_typ_cd 和 NOT 关键字之间需要一个类似 END 的关键字。

CASE WHEN exc_ind=1 THEN mrktng_pckge_typ_cd NOT IN ('a','b','c','d') ELSE NULL END

【问题讨论】:

  • 不确定您要达到的目标,但我认为在您的 then 块中您应该设置一个值。您的语句没有设置任何值。

标签: sql teradata data-warehouse


【解决方案1】:
where      exc_ind <> 1 
        or mrktng_pckge_typ_cd NOT IN ('a','b','c','d') 

如果 exc_ind 可以为 NULL -

where      coalesce (exc_ind,-1) <> 1 
        or mrktng_pckge_typ_cd NOT IN ('a','b','c','d') 

出于演示目的:

where case when coalesce (exc_ind,-1) <> 1 or mrktng_pckge_typ_cd NOT IN ('a','b','c','d') then 1 else 0 end = 1

【讨论】:

  • 我需要第一个。场景是这样的,如果指标等于一,我不应该获取类型代码提到的值,如果指标不等于一,我需要所有数据。这个检查应该发生在 where 子句中。
  • 要扩展出色的答案,您不能将casewhere in 结合使用。你必须为此使用动态 sql,我不认为宏不支持。所以你必须使用这个or 逻辑。
【解决方案2】:

您可能需要这样做。我给出了不同的表名,但你可以这样做:

Declare @condition as int = 1
SELECT *
FROM mstCity
WHERE( (1=@condition and Name IN (SELECT AliasCity.Name From mstCity AliasCity WHERE AliasCity.Name NOT IN ('USA','UK') )) OR 
       (2=@condition AND Name IN (SELECT AliasCity.Name From mstCity AliasCity  ))
     )

根据您的查询更新的答案应如下所示:

WHERE ( ( exc_ind= 1 AND mrktng_pckge_typ_cd NOT IN ('a','b','c','d')) OR 
    ( exc_ind <> 1 AND 1=1 )
  )

【讨论】:

  • 感谢 Snehal 的回答,但这段代码进入了 SQL 宏,所以我不能在那里使用这个变量逻辑。还有其他解决方案吗?
  • 您无需使用可变逻辑,这只是示例。在您的情况下,您必须在第一个条件下使用 exc_ind=1,在第二个条件下您必须编写 exc_ind1
  • 投反对票 (1) 使用 SQL Server 代码回答 Teradata 问题 (2) 提供完全不相关的代码作为参考 (3) “AND 1=1”。认真的吗?
  • 感谢 snehal 的回复。
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 2014-09-08
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多