Oracle SQL CASE 包括表达式子句错误 ORA-00936: 缺少表达式
Oracle SQL CASE Including the expression clause Error ORA-00936: missing expression
我有一个工作正常的 CASE
语句,我想将它包含在另一个 CASE
语句中,但我收到 ORA-00936: missing expression
错误,因为我希望它使用 IN
不是 =
.
遵循这个逻辑。
The CASE statement can be used in Oracle/PLSQL.
You could use the CASE statement in a SQL statement as follows: (includes the expression clause)
CASE owner
WHEN 'SYS' THEN 'The owner is SYS'
WHEN 'SYSTEM' THEN 'The owner is SYSTEM'
ELSE 'The owner is another value'
END
我的代码:
CASE (CASE WHEN l.dnames = 'II-SH' THEN 'IW'
WHEN l.dnames = 'IIC-SH' THEN 'IW'
WHEN l.dnames = 'CD' THEN 'RPFX'
WHEN l.dnames LIKE '%-%' THEN SUBSTR(l.dnames, INSTR(l.dnames, '-',2,1)+1, 20 )
WHEN l.dnames LIKE 'EXCR%' THEN SUBSTR(l.dnames, (INSTR(l.dnames, 'EXCR',1,1)+4),20)
WHEN l.dnames = 'EX' AND l.ditems LIKE '%/%' THEN REPLACE(SUBSTR(l.ditems, 1,INSTR(l.ditems, '/',1)-1),'SINV')
WHEN l.dnames = 'EX' THEN REGEXP_REPLACE(REPLACE(REPLACE(l.ditems,'SINV'),'INV'), '[0-9]','')
WHEN l.dnames LIKE 'EX%' THEN SUBSTR(l.dnames, INSTR(l.dnames, 'EX',1)+2 ,20)
ELSE NULL
END)
WHEN IN ('BA', 'BG', 'BT') THEN 'First'
WHEN IN ('BW', 'PF', 'SS') THEN 'Second'
WHEN IN ('TC', 'NE') THEN 'Third'
ELSE NULL
END AS DGROUP
聪明,但这不是 case
或 in
的工作方式。你可以这样做:
SELECT (CASE (CASE WHEN l.dnames = 'II-SH' THEN 'IW'
WHEN l.dnames = 'IIC-SH' THEN 'IW'
WHEN l.dnames = 'CD' THEN 'RPFX'
WHEN l.dnames LIKE '%-%' THEN SUBSTR(l.dnames, INSTR(l.dnames, '-',2,1)+1, 20 )
WHEN l.dnames LIKE 'EXCR%' THEN SUBSTR(l.dnames, (INSTR(l.dnames, 'EXCR',1,1)+4),20)
WHEN l.dnames = 'EX' AND l.ditems LIKE '%/%' THEN REPLACE(SUBSTR(l.ditems, 1,INSTR(l.ditems, '/',1)-1),'SINV')
WHEN l.dnames = 'EX' THEN REGEXP_REPLACE(REPLACE(REPLACE(l.ditems,'SINV'),'INV'), '[0-9]','')
WHEN l.dnames LIKE 'EX%' THEN SUBSTR(l.dnames, INSTR(l.dnames, 'EX',1)+2 ,20)
END)
WHEN 'BA' THEN 'FIRST'
WHEN 'BG' THEN 'FIRST'
WHEN 'BT' THEN 'First'
WHEN 'BW' THEN 'Second'
WHEN 'PF' THEN 'Second'
WHEN 'SS' THEN 'Second'
WHEN 'TC' THEN 'Third'
WHEN 'NE' THEN 'Third'
END) AS DGROUP
但是,这很难阅读。我鼓励您使用子查询:
SELECT (CASE WHEN FieldName IN ('BA', 'BG', 'BT') THEN 'First'
WHEN FieldName IN ('BW', 'PF', 'SS') THEN 'Second'
WHEN FieldName IN ('TC', 'NE') THEN 'Third'
END) AS DGROUP
FROM (SELECT (CASE WHEN l.dnames = 'II-SH' THEN 'IW'
WHEN l.dnames = 'IIC-SH' THEN 'IW'
WHEN l.dnames = 'CD' THEN 'RPFX'
WHEN l.dnames LIKE '%-%' THEN SUBSTR(l.dnames, INSTR(l.dnames, '-',2,1)+1, 20 )
WHEN l.dnames LIKE 'EXCR%' THEN SUBSTR(l.dnames, (INSTR(l.dnames, 'EXCR',1,1)+4),20)
WHEN l.dnames = 'EX' AND l.ditems LIKE '%/%' THEN REPLACE(SUBSTR(l.ditems, 1,INSTR(l.ditems, '/',1)-1),'SINV')
WHEN l.dnames = 'EX' THEN REGEXP_REPLACE(REPLACE(REPLACE(l.ditems,'SINV'),'INV'), '[0-9]','')
WHEN l.dnames LIKE 'EX%' THEN SUBSTR(l.dnames, INSTR(l.dnames, 'EX',1)+2 ,20)
END) as FieldName
我还应该注意,外部 case
中的值列表与 inner
原因产生的列表不匹配。
有两种CASE,"searched"和"valued","valued"使用相等比较单个值,而"searched"可以使用任何比较运算符。在您的情况下,您尝试将两者混合使用。
可以使用 "valued",但您需要单独指定每个值:
CASE (CASE WHEN l.dnames = 'II-SH' THEN 'IW'
WHEN l.dnames = 'IIC-SH' THEN 'IW'
WHEN l.dnames = 'CD' THEN 'RPFX'
WHEN l.dnames LIKE '%-%' THEN SUBSTR(l.dnames, INSTR(l.dnames, '-',2,1)+1, 20 )
WHEN l.dnames LIKE 'EXCR%' THEN SUBSTR(l.dnames, (INSTR(l.dnames, 'EXCR',1,1)+4),20)
WHEN l.dnames = 'EX' AND l.ditems LIKE '%/%' THEN REPLACE(SUBSTR(l.ditems, 1,INSTR(l.ditems, '/',1)-1),'SINV')
WHEN l.dnames = 'EX' THEN REGEXP_REPLACE(REPLACE(REPLACE(l.ditems,'SINV'),'INV'), '[0-9]','')
WHEN l.dnames LIKE 'EX%' THEN SUBSTR(l.dnames, INSTR(l.dnames, 'EX',1)+2 ,20)
ELSE NULL
END)
WHEN 'BA' THEN 'First'
WHEN 'BG' THEN 'First'
WHEN 'BT' THEN 'First'
WHEN 'BW' THEN 'Second'
WHEN 'PF' THEN 'Second'
WHEN 'SS' THEN 'Second'
WHEN 'TC' THEN 'Third'
WHEN 'NE' THEN 'Third'
ELSE NULL
END AS DGROUP
我有一个工作正常的 CASE
语句,我想将它包含在另一个 CASE
语句中,但我收到 ORA-00936: missing expression
错误,因为我希望它使用 IN
不是 =
.
遵循这个逻辑。
The CASE statement can be used in Oracle/PLSQL. You could use the CASE statement in a SQL statement as follows: (includes the expression clause)
CASE owner
WHEN 'SYS' THEN 'The owner is SYS'
WHEN 'SYSTEM' THEN 'The owner is SYSTEM'
ELSE 'The owner is another value'
END
我的代码:
CASE (CASE WHEN l.dnames = 'II-SH' THEN 'IW'
WHEN l.dnames = 'IIC-SH' THEN 'IW'
WHEN l.dnames = 'CD' THEN 'RPFX'
WHEN l.dnames LIKE '%-%' THEN SUBSTR(l.dnames, INSTR(l.dnames, '-',2,1)+1, 20 )
WHEN l.dnames LIKE 'EXCR%' THEN SUBSTR(l.dnames, (INSTR(l.dnames, 'EXCR',1,1)+4),20)
WHEN l.dnames = 'EX' AND l.ditems LIKE '%/%' THEN REPLACE(SUBSTR(l.ditems, 1,INSTR(l.ditems, '/',1)-1),'SINV')
WHEN l.dnames = 'EX' THEN REGEXP_REPLACE(REPLACE(REPLACE(l.ditems,'SINV'),'INV'), '[0-9]','')
WHEN l.dnames LIKE 'EX%' THEN SUBSTR(l.dnames, INSTR(l.dnames, 'EX',1)+2 ,20)
ELSE NULL
END)
WHEN IN ('BA', 'BG', 'BT') THEN 'First'
WHEN IN ('BW', 'PF', 'SS') THEN 'Second'
WHEN IN ('TC', 'NE') THEN 'Third'
ELSE NULL
END AS DGROUP
聪明,但这不是 case
或 in
的工作方式。你可以这样做:
SELECT (CASE (CASE WHEN l.dnames = 'II-SH' THEN 'IW'
WHEN l.dnames = 'IIC-SH' THEN 'IW'
WHEN l.dnames = 'CD' THEN 'RPFX'
WHEN l.dnames LIKE '%-%' THEN SUBSTR(l.dnames, INSTR(l.dnames, '-',2,1)+1, 20 )
WHEN l.dnames LIKE 'EXCR%' THEN SUBSTR(l.dnames, (INSTR(l.dnames, 'EXCR',1,1)+4),20)
WHEN l.dnames = 'EX' AND l.ditems LIKE '%/%' THEN REPLACE(SUBSTR(l.ditems, 1,INSTR(l.ditems, '/',1)-1),'SINV')
WHEN l.dnames = 'EX' THEN REGEXP_REPLACE(REPLACE(REPLACE(l.ditems,'SINV'),'INV'), '[0-9]','')
WHEN l.dnames LIKE 'EX%' THEN SUBSTR(l.dnames, INSTR(l.dnames, 'EX',1)+2 ,20)
END)
WHEN 'BA' THEN 'FIRST'
WHEN 'BG' THEN 'FIRST'
WHEN 'BT' THEN 'First'
WHEN 'BW' THEN 'Second'
WHEN 'PF' THEN 'Second'
WHEN 'SS' THEN 'Second'
WHEN 'TC' THEN 'Third'
WHEN 'NE' THEN 'Third'
END) AS DGROUP
但是,这很难阅读。我鼓励您使用子查询:
SELECT (CASE WHEN FieldName IN ('BA', 'BG', 'BT') THEN 'First'
WHEN FieldName IN ('BW', 'PF', 'SS') THEN 'Second'
WHEN FieldName IN ('TC', 'NE') THEN 'Third'
END) AS DGROUP
FROM (SELECT (CASE WHEN l.dnames = 'II-SH' THEN 'IW'
WHEN l.dnames = 'IIC-SH' THEN 'IW'
WHEN l.dnames = 'CD' THEN 'RPFX'
WHEN l.dnames LIKE '%-%' THEN SUBSTR(l.dnames, INSTR(l.dnames, '-',2,1)+1, 20 )
WHEN l.dnames LIKE 'EXCR%' THEN SUBSTR(l.dnames, (INSTR(l.dnames, 'EXCR',1,1)+4),20)
WHEN l.dnames = 'EX' AND l.ditems LIKE '%/%' THEN REPLACE(SUBSTR(l.ditems, 1,INSTR(l.ditems, '/',1)-1),'SINV')
WHEN l.dnames = 'EX' THEN REGEXP_REPLACE(REPLACE(REPLACE(l.ditems,'SINV'),'INV'), '[0-9]','')
WHEN l.dnames LIKE 'EX%' THEN SUBSTR(l.dnames, INSTR(l.dnames, 'EX',1)+2 ,20)
END) as FieldName
我还应该注意,外部 case
中的值列表与 inner
原因产生的列表不匹配。
有两种CASE,"searched"和"valued","valued"使用相等比较单个值,而"searched"可以使用任何比较运算符。在您的情况下,您尝试将两者混合使用。
可以使用 "valued",但您需要单独指定每个值:
CASE (CASE WHEN l.dnames = 'II-SH' THEN 'IW'
WHEN l.dnames = 'IIC-SH' THEN 'IW'
WHEN l.dnames = 'CD' THEN 'RPFX'
WHEN l.dnames LIKE '%-%' THEN SUBSTR(l.dnames, INSTR(l.dnames, '-',2,1)+1, 20 )
WHEN l.dnames LIKE 'EXCR%' THEN SUBSTR(l.dnames, (INSTR(l.dnames, 'EXCR',1,1)+4),20)
WHEN l.dnames = 'EX' AND l.ditems LIKE '%/%' THEN REPLACE(SUBSTR(l.ditems, 1,INSTR(l.ditems, '/',1)-1),'SINV')
WHEN l.dnames = 'EX' THEN REGEXP_REPLACE(REPLACE(REPLACE(l.ditems,'SINV'),'INV'), '[0-9]','')
WHEN l.dnames LIKE 'EX%' THEN SUBSTR(l.dnames, INSTR(l.dnames, 'EX',1)+2 ,20)
ELSE NULL
END)
WHEN 'BA' THEN 'First'
WHEN 'BG' THEN 'First'
WHEN 'BT' THEN 'First'
WHEN 'BW' THEN 'Second'
WHEN 'PF' THEN 'Second'
WHEN 'SS' THEN 'Second'
WHEN 'TC' THEN 'Third'
WHEN 'NE' THEN 'Third'
ELSE NULL
END AS DGROUP