case语句上的sql in()函数

Posted

技术标签:

【中文标题】case语句上的sql in()函数【英文标题】:sql in() function on case statement 【发布时间】:2013-06-03 22:26:52 【问题描述】:

下面的代码对我不起作用,如果可能的话,我希望得到解决方法的帮助。

我正在尝试根据日期排除某些元素,但我没有运气。

到目前为止,我的代码看起来有点像这样:

SELECT CASE  
WHEN date > '2013'  
       THEN element NOT IN ('e1', 'e2', 'e3') --exclude 3 elements  
       WHEN date > '2012' AND date <= '2013'  
       THEN element NOT IN ('e2', 'e3') --exclude 2 elements  
       WHEN date > '2011' AND date <= '2012'  
       THEN element NOT IN ('e3') --exclude 1 element  
       WHEN date <= '2011'  
       THEN element -- no elements excluded  
       END  
FROM elementTable 

这是伪代码。 sql 给出的错误是“NOT 语法不正确”。 我不完全确定为什么,但它似乎不喜欢我的 NOT IN 声明。

欢迎任何形式的提示、提示或帮助。

提前致谢。

【问题讨论】:

你用的是什么sql? MSSQL 或 mysql 【参考方案1】:

试试这个。

SELECT CASE 
   WHEN [DATE] > '2013' AND element NOT IN ('e1', 'e2', 'e3')
   THEN element 
   WHEN date > '2012' AND date <= '2013' AND element NOT IN ('e2', 'e3') --exclude 2 elements
   THEN element 
   WHEN date > '2011' AND date <= '2012' AND element NOT IN ('e3') --exclude 1 element
   THEN element 
   WHEN date <= '2011'
   THEN element -- no elements excluded
   ELSE
    NULL
   END
FROM elementTable

【讨论】:

值得注意的是,在这个解决方案中,您仍然会得到排除元素的 NULL。 真的。他/她将不得不为他/她想要做的事情定义其他部分。伪代码没有提及其他任何内容,因此我为其设置了 NULL。【参考方案2】:

您正在尝试在 CASETHEN 部分添加表达式,而需要声明。 而不是使用CASE 尝试将条件移动到WHERE 部分:

SELECT element
FROM elementTable
WHERE (date > '2013' AND element NOT IN ('e1', 'e2', 'e3'))
OR (date > '2012' AND date <= '2013' AND element NOT IN ('e2', 'e3'))
OR (date > '2011' AND date <= '2012' AND element NOT IN ('e3'))
OR date <= '2011'

【讨论】:

以上是关于case语句上的sql in()函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server CASE .. WHEN .. IN 语句

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

sqlserver case when问题

具有 3 个输出的 Oracle SQL WHERE CASE IN 语句

SQL Server - CASE 语句上的 PIVOT