【问题标题】:Case when in sql oracle在sql oracle中的情况
【发布时间】:2020-10-14 08:34:55
【问题描述】:

我是 sql oracle 的新手,在这里我遇到了如何用例的问题,例如是这样的:

  1. 如果 transaction_type RECEIVE 那么收货日期 - 承诺日期

  2. 如果收货日期 > 承诺日期,则收货日期 - 承诺日期

  3. 如果收货日期

  4. 如果尚未收到或 transaction_type DELIVER 则 sysdate - 承诺日期

    CASE WHEN transaction_type ='RECEIVE' THEN to_char(creation_date, 'DD-MON-YYYY') – to_char(promised_date, 'DD-MON-YYYY')
      WHEN to_char(creation_date, 'DD-MON-YYYY') > to_char(promised_date, 'DD-MON-YYYY') THEN to_char(creation_date, 'DD-MON-YYYY') – to_char(promised_date, 'DD-MON-YYYY')
      WHEN to_char(creation_date, 'DD-MON-YYYY') <= to_char(promised_date, 'DD-MON-YYYY') THEN null
      WHEN transaction_type ='DELIVER' THEN to_char(sysdate, 'DD-MON-YYYY') - to_char(promised_date, 'DD-MON-YYYY') END AS delay_day
    

ORA-00911: 无效字符 00911. 00000 - “无效字符” *原因:标识符名称以非 ASCII 字符开头 字母或数字。在标识符的第一个字符之后 名称,ASCII 字符是允许的,包括“$”、“#”和“_”。 用双引号括起来的标识符可以包含任何 双引号以外的字符。替代报价 标记 (q'#...#') 不能使用空格、制表符或回车作为 分隔符。对于所有其他上下文,请参阅 SQL 语言 参考手册。 *操作:检查 Oracle 标识符命名约定。如果你是 试图在 IDENTIFIED BY 子句中提供密码 一个 CREATE USER 或 ALTER USER 语句,那么建议 始终将密码用双引号引起来,因为 然后允许使用双引号以外的字符。 行错误:21 列:94

这是错误,我不知道这是什么问题

【问题讨论】:

    标签: oracle plsql case oracle-sqldeveloper


    【解决方案1】:

    看起来您从一些 fancy 文本编辑器(也许是 MS Word?)复制/粘贴了代码,该编辑器使用 fancy 字符作为单引号和双引号,以及 减号。如果转换为“正常”减去-,那么应该没问题:

          CASE
              WHEN transaction_type = 'RECEIVE'
              THEN
                   TO_CHAR (creation_date, 'DD-MON-YYYY')
                 - TO_CHAR (promised_date, 'DD-MON-YYYY')         --> this minus
              WHEN TO_CHAR (creation_date, 'DD-MON-YYYY') >
                   TO_CHAR (promised_date, 'DD-MON-YYYY')
              THEN
                   TO_CHAR (creation_date, 'DD-MON-YYYY')
                 - TO_CHAR (promised_date, 'DD-MON-YYYY')         --> and this minus
              WHEN TO_CHAR (creation_date, 'DD-MON-YYYY') <=
                   TO_CHAR (promised_date, 'DD-MON-YYYY')
              THEN
                 NULL
              WHEN transaction_type = 'DELIVER'
              THEN
                   TO_CHAR (SYSDATE, 'DD-MON-YYYY')
                 - TO_CHAR (promised_date, 'DD-MON-YYYY')
           END AS delay_day
    

    然而:您期望得到什么结果?两个字符串的减法是荒谬的。 'A' - '23FX__#' 是什么?如果您想减去 日期,当然 - 为什么不 - 结果将是这两个日期之间的天数。

    此外,在大多数情况下,比较字符串也不起作用。

    这意味着你应该——也许——完全删除 TO_CHAR。

            CASE
              WHEN transaction_type = 'RECEIVE'
              THEN
                 creation_date - promised_date
              WHEN creation_date > promised_date
              THEN
                 creation_date - promised_date
              WHEN creation_date <= promised_date
              THEN
                 NULL
              WHEN transation_type = 'DELIVER'
              THEN
                 SYSDATE - promised_date
           END AS delay_day
    

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多