Sql 在oracle中,是否有任何方法可以添加CASE-WHEN语句

Sql 在oracle中,是否有任何方法可以添加CASE-WHEN语句,sql,oracle,Sql,Oracle,因此,如果输入参数:STATUS!=无效的现在,我来到这里 ... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') AND to_date(:NUMDAYS2, 'DD.MM.RRRR') AND CASE WHEN :STATUS = null then NSR_STATUS != 1 else NSR_STATUS = :STATUS AND NVL(NSR_MAGAZ,-1) ... 我也尝试过类似的东西(

因此,如果输入参数:STATUS!=无效的现在,我来到这里

... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') 
AND to_date(:NUMDAYS2, 'DD.MM.RRRR')
AND 
  CASE WHEN :STATUS = null then NSR_STATUS != 1 
  else NSR_STATUS = :STATUS
AND NVL(NSR_MAGAZ,-1) ...
我也尝试过类似的东西(从这里你可能会更好地了解我在这里要归档的内容)


我现在真的被卡住了。有什么建议吗?

除了尼克的评论,在混合和&或时也要使用括号

或的优先级低于和,如果不使用括号,则始终最后处理

... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') AND to_date(:NUMDAYS2, 'DD.MM.RRRR')
AND (
     (NSR_STATUS = :STATUS AND :STATUS is not null) 
     or (NSR_STATUS != 1 AND :STATUS is null)
    )
AND NVL(NSR_MAGAZ,-1) = ?? ...

您的CASE语句无效,因为CASE无法返回布尔条件(
1=1
NSR_STATUS!=1
,等等)。

除了Nick的注释外,在混合和和&或时也使用括号

或的优先级低于和,如果不使用括号,则始终最后处理

... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') AND to_date(:NUMDAYS2, 'DD.MM.RRRR')
AND (
     (NSR_STATUS = :STATUS AND :STATUS is not null) 
     or (NSR_STATUS != 1 AND :STATUS is null)
    )
AND NVL(NSR_MAGAZ,-1) = ?? ...

您的CASE语句无效,因为CASE无法返回布尔条件(
1=1
NSR_STATUS!=1
,等等)。

CASE表达式应返回值,而不是逻辑表达式:

... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') AND
          to_date(:NUMDAYS2, 'DD.MM.RRRR') AND 
          1 = CASE
                WHEN :STATUS IS NULL AND NSR_STATUS != 1 THEN 1
                WHEN NSR_STATUS = :STATUS THEN 1
                ELSE 0
              END AND
          NVL(NSR_MAGAZ,-1) ...

大小写表达式应返回值,而不是逻辑表达式:

... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') AND
          to_date(:NUMDAYS2, 'DD.MM.RRRR') AND 
          1 = CASE
                WHEN :STATUS IS NULL AND NSR_STATUS != 1 THEN 1
                WHEN NSR_STATUS = :STATUS THEN 1
                ELSE 0
              END AND
          NVL(NSR_MAGAZ,-1) ...

:状态为空或:状态不为空:STATUS=null将始终计算为FALSE。现在它仅在:STATUS不为null时工作。第二个“OR”语句未被引用,但:为什么要将日期值作为字符串传递?这是针对oracle报表的。使用string命令从java调用它更容易:STATUS为null或:STATUS为NOT null.:STATUS=null将始终计算为FALSE。现在它仅在:STATUS不为null时工作。第二个“OR”语句未被引用,但:为什么要将日期值作为字符串传递?这是针对oracle报表的。使用string命令从java调用它更容易