where子句基于条件

时间:2011-06-21 05:49:40

标签: sql

我有一个匹配列的查询。要匹配的值可以为null或不为null(存在某个值)。匹配发生时会出现问题。如果值存在匹配,如

table.column = somevalue

工作正常,但如果值为null,则匹配需要以

完成
table.column is null

是否有某种方法可以根据值<?p>选择WHERE子句中使用的条件

提前致谢

6 个答案:

答案 0 :(得分:3)

ORing你的WHERE条款怎么样?

SELECT
*
FROM table
WHERE ((table.column = 123) AND table.column IS NOT NULL))
OR    (table.column IS NULL)

答案 1 :(得分:1)

使用CASE语句,例如:

SELECT
  CASE
    WHEN mycol IS NULL
      THEN 'it is null'
    WHEN mycol = 'foo'
      THEN 'it is foo'
    ELSE 'it is something else'
  END AS col
FROM mytable;

(注意:我不知道你使用的是什么数据库,所以上面可能需要“IS NULL”,“ISNULL”,“ISNULL()”

答案 2 :(得分:1)

答案 3 :(得分:1)

尝试使用ISNULL(somevalue,0)。前提是您的“somevalue”table.column没有0是有效值。您可以使用任何在table.column

中永远不会显示为有效值的字符串/数字,而不是0

答案 4 :(得分:1)

在ms sql中你可以做到

      declare @match int
      select * from tbl where coalesce(tblValue, @match) = @match

这样,当tblValue为空时,你会将@match与自身进行比较。

当然,如果参数为null,则可以通过切换匹配

来消除该参数
      select * from tbl where tblValue = coalesce(@match, tblValue) 

但后一个查询可能导致查询优化器忽略tblValue上的索引,因此您应该检查执行计划。

答案 5 :(得分:1)

我使用了decode和case语句来解决这个问题 这已经在oracle中完成了。


    AND DECODE(TSBI.SHIP_TRAIL_STATUS, 
               'L', 
               'TRUE', 
               'C', 
               (SELECT CASE 
                    WHEN TSBI.UPD_ON + 10 >= SYSDATE THEN 
                         'TRUE' 
                     ELSE 
                          'FALSE' 
                      END 
                FROM DUAL)) = 'TRUE'

在这种情况下,我检查了SHIP_TRAIL_STATUS。如果它返回'L',则解码函数返回TRUE。如果它返回'C',则解码检查UPD_ON值。因此,此CASE语句返回TRUE或FALSE。