Orace SQL案例WHEN语句“缺少关键字”

时间:2019-09-27 16:05:32

标签: sql

我将BI Publisher与Oracle Fusion 19c一起使用

我试图查看一个1000个单词的VARCHAR字段(POH.NOTE_TO_VENDOR),然后如果它包含单词Hearing及其后面的字符(substr的第一部分)不是空白,即存在日期。然后,我想将整个substr转换为日期,否则将其留空。

我可以使连接的substr正常工作,并将其显示为字符串,或者作为日期显示,或者如果日期不存在,则该值为'//',但无法直接转换,因为如果该值返回'//',则它将无法转换到目前为止。

, CASE WHEN SUBSTR(POH.NOTE_TO_VENDOR, (INSTR(POH.NOTE_TO_VENDOR,'Hearing: ')+14),2)IS NOT NULL 
  THEN (TO_DATE((SUBSTR(POH.NOTE_TO_VENDOR, (INSTR(POH.NOTE_TO_VENDOR,'Hearing: ')+17),2)||'/'||SUBSTR(POH.NOTE_TO_VENDOR, (INSTR(POH.NOTE_TO_VENDOR,'Hearing: ')+14),2)||'/'||SUBSTR(POH.NOTE_TO_VENDOR, (INSTR(POH.NOTE_TO_VENDOR,'Hearing: ')+11),2)),'DD/MM/YY')) 
  ELSE 
  END

此代码返回错误缺少关键字。我希望它将字符串转换为日期或返回一个空白值。

在没有其他条件的情况下尝试了else条件

我还尝试了Case何时……然后是“ 1”,否则是“ 0”,可以正确返回1和0

1 个答案:

答案 0 :(得分:0)

问题在于括号的混乱。
我删除了所有不必要的括号,这些括号使代码难以阅读且难以发现语法错误:

, CASE WHEN SUBSTR(POH.NOTE_TO_VENDOR, INSTR(POH.NOTE_TO_VENDOR,'Hearing: ') + 14, 2) IS NOT NULL 
    THEN TO_DATE(
      SUBSTR(POH.NOTE_TO_VENDOR, INSTR(POH.NOTE_TO_VENDOR,'Hearing: ') + 17, 2)
      || '/' ||
      SUBSTR(POH.NOTE_TO_VENDOR, INSTR(POH.NOTE_TO_VENDOR,'Hearing: ') + 14, 2)
      || '/' ||
      SUBSTR(POH.NOTE_TO_VENDOR, INSTR(POH.NOTE_TO_VENDOR,'Hearing: ') + 11, 2),
      'DD/MM/YY'
    ) 
  END

我还删除了ELSE,如果在这种情况下只需要NULL,则不需要。