谢谢,我用的是甲骨文10g。在SQL语句中,我们传递值并根据值和返回字符串检查大小写。但是,我不返回字符串,而是返回一个表达式。是否可以使用oracle查询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').我的实际任务是从内部查询返回一个表达式,并在外部查询中使用。
发布于 2014-02-04 11:01:01
不你所展示的是不可能的。在select中真正有一个表达式是没有意义的。你可以 instead of using a fixed string
SELECT ECL_CONTROL,
CASE
WHEN ECL_CONTROL = 'N' THEN '##0'
WHEN ECL_CONTROL = 'Y' THEN NVL(IL.ECL, 'X')
END
FROM ITEM_CONTROL WHERE ITEM_NO = '2N2907A' 但你不能返回实际的表达式。在您已经展示的代码中,第一个表达式无论如何都会计算为true (普通SQL中也不存在布尔表达式),所以我认为这可能是您真正想要的,并且您对如何分配表达式值感到困惑。您还没有说明IL和IM是从哪里来的,所以很难确定您想要什么。
可以在case子句中直接使用where:
SELECT ...
FROM IM, IL, ITEM_CONTROL -- joined in some way
WHERE CASE
WHEN ECL_CONTROL = 'N' THEN '##0'
WHEN ECL_CONTROL = 'Y' THEN NVL(IL.ECL, 'X')
END = CASE
WHEN ECL_CONTROL = 'N' THEN '##0'
WHEN ECL_CONTROL = 'Y' THEN NVL(IM.ECL, 'X')
END虽然这一点可能更清楚,因为:
WHERE ECL_CONTROL = 'N' OR NVL(IL.ECL, 'X') = NVL(IM.ECL, 'X')在您添加的更大的查询中:
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 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')
AND ((SELECT ECL_CONTROL FROM ITEM_CONTROL WHERE ITEM_NO = '2N2907A') = 'N'
OR NVL(IL.ECL, 'X') = NVL(IM.ECL, 'X'))..。尽管子查询正在查找单个行(与其他表中引用的名称相同的其他列相关联的固定item_no ),所以您可以只在主查询中包含该表。
无论哪种方式。顺便提一句,如果使用显式联接,这会更清楚;而是超出了问题的范围,但考虑到item_no实际上是相关的,如下所示:
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_LIFE_LOG LLG
JOIN LS_SERIAL_MASTER LSM ON 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
JOIN ITEM_CONTROL IC ON IC.ITEM_NO = LSM.ITEM_NO
JOIN ITEM_MASTER IM ON IM.PLANT = LSM.PLANT
AND IM.ITEM_NO = IC.ITEM_NO
JOIN ITEM_LOCATION IL ON IL.PLANT = IM.PLANT
AND IL.ITEM_NO = IM.ITEM_NO
AND IL.SERIAL_NO = LLG.SERIAL_NO
AND (IC.ECL_CONTROL = 'N' OR NVL(IL.ECL, 'X') = NVL(IM.ECL, 'X'))
WHERE 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')
AND NVL(IM.PRODUCT_GROUP, 'X') = NVL('PUMP', 'X')但是,NVL('PUMP', 'X')没有意义-- NVL()在一个固定的值周围是没有意义的。也许不是AND NVL(IM.PRODUCT_GROUP, 'X') = NVL('PUMP', 'X'),你是说AND (IM.PRODUCT_GROUP IS NULL OR IM.PRODUCT_GROUP = 'PUMP')
https://stackoverflow.com/questions/21550376
复制相似问题