ELSE部分的SELECT语句?

时间:2013-10-04 10:16:12

标签: sql oracle case

我相信ELSE中的SELECT语句也是可能的,对吗?

我有这个问题:

CASE ORDER1
        WHEN NULL
            THEN ''
        ELSE (
                SELECT P.VENDOR_ID
                FROM ORDERS1${RGCM_CAMP_LOGIC_SUFFIX} P
                LEFT JOIN ORDERS2${RGCM_CAMP_LOGIC_SUFFIX} O
                    ON P.CUSTOMER_ID = O.CUSTOMER_ID
                WHERE P.ORDER_DATE = O.ORDER1
                )
        END AS VENDOR_ID1

我很确定,子查询只返回1行我仍然收到错误: ORA-01427:单行子查询返回多行

我正在检查是否存在任何ORDER1,然后应选择其VENDOR_ID并将其称为VENDOR_ID1。

我在哪里做错了?

2 个答案:

答案 0 :(得分:1)

使用

 - SELECT MAX(P.VENDOR_ID)  or
 - SELECT TOP 1 P.VENDOR_ID

答案 1 :(得分:0)

您重写案例表达式会导致ORA错误,因为您忘记了IS NULL

ORDER1 IS NULL

时的情况

BUT: 我不建议在select子句中使用相关子查询 - 这似乎是一种非常低效的方法 - 即使它在case表达式中也是如此。

这里没有足够的总体查询来确切地知道要提出什么建议,但是你应该将这个逻辑转移到连接中,就像这样

LEFT JOIN (
SELECT CUSTOMER_ID
    , ORDER_DATE
    , VENDOR_ID
FROM ORDERS16F50TQDWsb
) P ON O.CUSTOMER_ID = P.CUSTOMER_ID
AND O.ORDER1 = P.ORDER_DATE

注意,你可能必须在这里使用GROUP BY,这样你才能获得比预期更多的行,但如果你确实需要这样做,那么你可能还需要采用MAX(ORDER_DATE)[或MIN() ] 作为适当的。只有更详细的整体查询,我才能更准确。

一旦你弄清楚如何收集这些信息,你的案例表达就会简单得多:

CASE WHEN ORDER1 IS NULL THEN '' ELSE P.VENDOR_ID END AS VENDOR_ID1,

并且,你需要确保VENDOR_ID1的日期类型是一个字符串,它不是那么你必须使用to_char(VENDOR_ID1)所以它与那个空字符串兼容。

最后,你肯定可以使用相等的运算符来比较日期;但数据可能不相等,例如可能会有几秒钟或几分钟的差异。可能需要截断日期以删除该问题,例如

TRUNC(O.ORDER1)= TRUNC(P.ORDER_DATE)

但实际上只需要这样做,否则你会浪费那些TRUNC()函数。