当使用CASE
语句在Oracle中执行下面的查询行时,我得到了一些不寻常的错误。
查询
SELECT MODEL_NAME,
CASE WHEN EQP_TYPE_NAME IN('BAT') THEN MODEL_NAME END AS EQUIPMENT_MODEL_NAME
FROM solar_equipment;
错误在下面
ORA-00911: invalid character
00911. 00000 - "invalid character"
*Cause: identifiers may not start with any ASCII character other than
letters and numbers. $#_ are also allowed after the first
character. Identifiers enclosed by doublequotes may contain
any character other than a doublequote. Alternative quotes
(q'#...#') cannot use spaces, tabs, or carriage returns as
delimiters. For all other contexts, consult the SQL Language
Reference Manual.
*Action:
Error at Line: 4 Column: 1
请提出什么是错的
2条答案
按热度按时间jum4pzuy1#
最可能的原因(基于评论中关于“复制和粘贴”的交流):
您从某个地方复制了整个查询-很可能是网站-其中单引号不是ASCII字符集的标准撇号。相反,它们是书法语录。这特别适用于IN子句,其中字符串BAT用单引号括起来。这就是为什么如果你在编辑器中重新输入查询,你不会遇到这个问题。
这个问题被这样一个事实所掩盖,如果你从 wherever 复制查询并将其粘贴到编辑器中,引号会在GUI中被无声地翻译成标准的撇号(仅用于 * 显示 *)-但不会在实际的查询文本中。而且,这个问题最初可能是因为有人将一个有效的查询(带有标准ASCII撇号)复制到网站,网站会悄悄地将这些单引号转换成书法引号。
让老大哥为我们做事而不问我们,甚至不告诉我们他在做什么,这是许多“好处”之一。..
为什么会出现这样的错误?因为解析器将查询中的每个“标记”解释为字符串、SQL关键字或标识符(表名或列名)等。当它到达用书法引号括起来的BAT时,它不能是硬编码的字符串,也不是SQL关键字等。- 所以解析器猜测它是标识符;但没有用双引号括起来的标识符不能以书法左单引号开始。所以解析器会告诉您“标识符”是无效的。
bttbmeg02#
由于一些奇怪的原因,当您将通过Microsoft Teams聊天发送的Oracle DDL粘贴到SQL Developer时,总是会发生此错误。
似乎一些隐藏的无效字符被添加到代码中,解决这个问题的唯一方法是手动重新输入所有内容(不推荐)或通过电子邮件或其他渠道获取。
想一想类似的情况,Microsoft Word自动将您的直引号字符更改为排版引号,后者在SQL中是非法的。
转换为: