我相信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。
我在哪里做错了?
答案 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()函数。