在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结果添加虚拟行