在sql oracle中的情况

Posted

技术标签:

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

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

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

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

    如果收货日期

    如果尚未收到或 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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在sql oracle中的情况的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组

如何在不使用 to_date /to_char 函数的情况下比较 oracle sql 中的日期?

如何在不进行分组的情况下在Oracle中向SQL结果添加虚拟行

通过添加嵌入在 PL-SQL(Oracle 函数)中的 select 子句来处理异常

在我的情况下,如何在 Oracle 中编写 SQL?

Oracle SQL调优记录