【发布时间】:2014-02-04 10:51:46
【问题描述】:
在此先感谢,我使用的是 oracle 10g。在 SQL case 语句中,我们传递值并根据值检查大小写并返回字符串。但我不想返回字符串,而是返回一个表达式。这是否可以使用 oracle SQL 查询 CASE 语句返回表达式?我执行以下操作,oracle 生成错误ORA-00905:Missing Keyword
SELECT ECL_CONTROL,
CASE
WHEN ECL_CONTROL = 'N' THEN ('##0') = ('##0')
WHEN ECL_CONTROL = 'Y' THEN (NVL(IL.ECL, 'X') = NVL(IM.ECL, 'X'))
END
FROM ITEM_CONTROL WHERE ITEM_NO = '2N2907A'
但以下运行成功:
SELECT ECL_CONTROL,
CASE
WHEN ECL_CONTROL = 'N' THEN 'test'
WHEN ECL_CONTROL = 'Y' THEN 'demo'
END
FROM ITEM_CONTROL WHERE ITEM_NO = '2N2907A'
我想使用这个查询作为内部查询和外部查询的返回和表达式。我的查询如下:
SELECT LSM.ACTIVE_FLAG, LSM.ITEM_NO, IL.ECL, LSM.SERIAL_NO, IL.WAREHOUSE, IL.BIN, LSM.TOOL_STATUS_CODE,
LLG.NEXT_CAL_DATE, IM.PRODUCT_GROUP
FROM LS_SERIAL_MASTER LSM, LS_LIFE_LOG LLG, ITEM_LOCATION IL, ITEM_MASTER IM
WHERE IL.PLANT = IM.PLANT AND IL.ITEM_NO = IM.ITEM_NO
AND IM.PLANT = LSM.PLANT AND IM.ITEM_NO = LSM.ITEM_NO AND NVL(IM.PRODUCT_GROUP, 'X') = NVL('PUMP', 'X')
AND LSM.PLANT = LLG.PLANT AND LSM.ITEM_NO = LLG.ITEM_NO AND LSM.SERIAL_NO = LLG.SERIAL_NO
AND LSM.LIFE_TRANS_ID = LLG.TRANS_ID AND LLG.SERIAL_NO = IL.SERIAL_NO
AND (SELECT ECL_CONTROL,
CASE ECL_CONTROL
WHEN ECL_CONTROL = 'N' THEN ('##0' = '##0')
WHEN ECL_CONTROL = 'Y' THEN (NVL(IL.ECL, 'X') = NVL(IM.ECL, 'X'))
END AS ECL_CONTROL_TXT
FROM ITEM_CONTROL WHERE ITEM_NO = '2N2907A')
AND LLG.MAINT_LMT_ID IN('T', 'U')
AND LLG.NEXT_CAL_DATE BETWEEN TO_DATE('02/1/2014', 'MM/DD/YYYY') AND TO_DATE('02/11/2014', 'MM/DD/YYYY').
我的实际任务是从内部查询返回一个表达式并在外部查询中使用。
【问题讨论】:
-
原因是,
THEN子句用于返回一个值,而不是用于比较值。在THEN子句中返回的值不能使用任何运算符 -
不,这是不可能的。您试图将表达式作为没有意义的结果集的一部分返回;你会怎么处理结果?你真的想返回
##0还是NVL(IL.ECL, 'X')的值,这样就可以了? -
ECL_CONTROL 列包含标志值'Y'或'N',如果值为'Y'我想返回
NVL(IL.ECL, 'X') = NVL(IM.ECL, 'X')如果值为'N'则返回值为('##0') = ('##0').此查询充当内部查询,在内部查询中,这些返回语句返回 where 条件的表达式。 -
IL和IM是别名或外部查询表。如果标志是'N'所以,我们只需要外部查询Y中的true表达式,那么我需要添加另一个表达式。
标签: sql database oracle10g case