Oracle Sql中的其他情况

0yycz8jy  于 2023-08-03  发布在  Oracle
关注(0)|答案(2)|浏览(112)

我有一个类似下面的查询,但我得到了以下错误::
SQL错误[907] [42000]:ORA-00907:缺少右括号
代码:

SELECT 
    typ.ID ID, typ.DETAILS DETAILS 
FROM 
    LMP_ORDER_MW_HOST_SVC_TYP typ 
LEFT JOIN 
    LMP_ORDER_MW_HOST_TRX lomht ON typ.ID = lomht.ORDER_SVC_TYP_ID 
WHERE 
    typ.ID IN (CASE 
                   WHEN lomht.ORDER_TRX_ID = :ORDER_TRX_ID 
                       THEN ('31', '21', '51', '45', '35') 
                       ELSE ('12', '13') 
               END);

字符串

bqucvtff

bqucvtff1#

CASE表达式实际上是用来生成新值的。相反,您应该在WHERE子句中使用直接的and/or逻辑:

SELECT typ.ID ID, typ.DETAILS DETAILS
FROM LMP_ORDER_MW_HOST_SVC_TYP typ
LEFT JOIN LMP_ORDER_MW_HOST_TRX lomht 
    ON typ.ID = lomht.ORDER_SVC_TYP_ID 
WHERE
    lomht.ORDER_TRX_ID = :ORDER_TRX_ID AND
    typ.ID IN ('31', '21', '51', '45', '35') OR
    lomht.ORDER_TRX_ID != :ORDER_TRX_ID AND
    typ.ID ('12', '13');

字符串

cwdobuhd

cwdobuhd2#

在SQL中,CASE表达式返回单个标量值(不是比较或值列表)。
不使用CASE表达式,你可以使用ANDOR逻辑运算符和括号来确定优先级,并且你需要确保你检查了NULL值的等价ELSE条件测试(因为,对于三进制逻辑,NULL永远不等于或不等于其他值):

SELECT typ.ID,
       typ.DETAILS
FROM   LMP_ORDER_MW_HOST_SVC_TYP typ 
       LEFT OUTER JOIN LMP_ORDER_MW_HOST_TRX lomht
       ON typ.ID = lomht.ORDER_SVC_TYP_ID 
WHERE  (   lomht.ORDER_TRX_ID = :ORDER_TRX_ID 
       AND typ.ID IN ('31', '21', '51', '45', '35')
       )
OR     (   (  lomht.ORDER_TRX_ID != :ORDER_TRX_ID
           OR lomht.ORDER_TRX_ID IS NULL
           OR :ORDER_TRX_ID      IS NULL
           )
       AND typ.ID IN ('12', '13')
       );

字符串

相关问题