【问题标题】:SQL case in where condition not working条件不起作用的 SQL 案例
【发布时间】:2017-04-27 14:03:44
【问题描述】:

我正在尝试根据非空条件编写动态 SQL 语句。基本上我有一个存储过程,它有 2 个输入参数,即 ip1 和 ip2。 ip1 将始终具有值,但 ip2 可能具有也可能没有作为 i/p 参数的值。所以我想用下面的例子写一个查询。我基本上只是在 ip2 id 不为 null 作为 i/p 参数的情况下尝试在 where 子句中添加 ip2 条件。如果 ip2 为空,则只需添加 ip1 条件。但是这个查询抛出了一个错误。你能建议我哪里出错了吗?

SELECT decode(COUNT(1),0,'N','Y')
INTO v_count
FROM table C
WHERE C.column1 = ip1 
  AND (CASE
          WHEN ip2 IS NOT NULL 
             THEN c.column2 = ip2 
       END); 

【问题讨论】:

  • WHEREON 子句中,通常最好使用AND/OR 而不是case 表达式。
  • 您使用哪种 DBMS?
  • AND (ip2 is NULL or c.column2 = ip2)

标签: sql oracle case where


【解决方案1】:
SELECT decode(COUNT(1),0,'N','Y')
    INTO   v_count
    FROM   table C
    WHERE  C.column1 = ip1 
    AND (ip2 IS NULL OR c.column2 = ip2); 

【讨论】:

    【解决方案2】:

    这也有效:

    SELECT decode(COUNT(1),0,'N','Y')
        INTO   v_count
        FROM   table C
        WHERE  C.column1 = @ip1
        AND C.column2 = isnull(@ip2, C.column2)
    

    ...请注意,如果 colmn2 可以包含 NULL 值,这将不起作用。

    【讨论】:

    • 由于我使用的是 Oracle RDBMS ,所以上面的查询不起作用。
    • 使用标签来识别您提出问题的系统将避免这些问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2012-06-15
    相关资源
    最近更新 更多