如何处理看起来像 SQL 关键字的 SQL 列名?
Posted
技术标签:
【中文标题】如何处理看起来像 SQL 关键字的 SQL 列名?【英文标题】:How to deal with SQL column names that look like SQL keywords? 【发布时间】:2008-11-12 23:18:47 【问题描述】:我的一个专栏叫做from
。我不能改名字,因为我没有成功。
我是否可以执行SELECT from FROM TableName
之类的操作,或者是否有特殊的语法可以避免 SQL Server 被混淆?
【问题讨论】:
我会说使用 ANSI SQL 的双引号作为分隔标识符。它适用于几乎所有 dbms,包括 SQL Server。 IE。只需SELECT "from" FROM TableName
,美观便携!
【参考方案1】:
将列名用括号括起来,from
变成 [from]。
select [from] from table;
也可以使用以下方式(查询多个表时很有用):
select table.[from] from table;
【讨论】:
怎么样:select TableName.from from TableName;
PS:它适用于 mysql
我今天早上才尝试过,但它似乎在我的 MySQL 安装中不起作用。是参数还是开启它的东西?
@CodeChimp - 尝试使用反引号,***.com/questions/2901453/… 这个问题/答案特定于 MS SQL Server。
对,但@FabricioPH 提到它在 MySQL 中工作。在我的本地 MySQL 安装上尝试此操作后,我从谷歌搜索中偶然发现。我想看看是否有一种通用的 ANSI SQL 方法可以在 SQL 中转义这样的东西。我们目前使用的是 SQL Server 2005,但我们的其他一些应用程序中也有 Oracle。我们希望对我们的 Java DAO 进行编码,这样如果我们被告知要从 SQL Server 迁移到其他东西,它就会“工作”。
@CodeChimp 我可以数出没有手指发生在我身上的次数。 :)【参考方案2】:
如果它在 PostgreSQL 中,请在名称周围使用双引号,例如:
select "from" from "table";
注意:内部 PostgreSQL 自动将所有未加引号的命令和参数转换为小写。这具有命令和标识符不区分大小写的效果。 sEleCt * from tAblE; 被解释为 select * from table;。但是,双引号内的参数按原样使用,因此区分大小写:select * from "table"; 和 select * from "Table"; 从两张不同的桌子。
【讨论】:
双引号也适用于 MS SQL,但不区分大小写。带引号的标识符只是 AFAIK,是括号分隔标识符的等效替代方案。 双引号也适用于 Amazon 的 Athena 使用的 Presto SQL 查询引擎。【参考方案3】:当您这样做时 - 将其别名为其他东西(或者更好的是,使用视图或 SP 并弃用旧的直接访问方法)。
SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName
【讨论】:
【参考方案4】:以下是两种方法:
-
在这里使用反引号:
从表名中选择`from`
-
您可以将表名提及为:
SELECT TableName.from FROM TableName
【讨论】:
谢谢,双引号和方括号语法不适用于我的客户端(MySQLWorkbench),但反勾号方法可以。【参考方案5】:您的问题似乎在这里得到了很好的回答,但我只想对这个主题再添加一条评论。
那些设计数据库的人应该很清楚保留关键字并避免使用它们。如果您发现有人使用它,请告知他们(以礼貌的方式)。这里的关键字是保留字。
更多信息:
"不应使用保留关键字 作为对象名称。数据库升级 从早期版本的 SQL Server 可能包含的标识符包括 前面没有保留的字 版本,但这是保留字 对于当前版本的 SQL Server。 您可以通过使用来引用对象 分隔标识符,直到名称 可以改变。” http://msdn.microsoft.com/en-us/library/ms176027.aspx
和
"如果您的数据库确实包含名称 匹配保留关键字,您必须 使用分隔标识符时 参考那些对象。更多 信息,请参阅标识符 (DMX)。” http://msdn.microsoft.com/en-us/library/ms132178.aspx
【讨论】:
【参考方案6】:在 Apache Drill 中,使用反引号:
select `from` from table;
【讨论】:
【参考方案7】:如果您使用的是 SQL Server,您可以简单地将方括号括在列或表名周围。
select [select]
from [table]
【讨论】:
【参考方案8】:我也遇到过这个问题。 而解决这个问题的方法是把 [Column_Name] 像这样放在查询中。
string query= "Select [Name],[Email] from Person";
所以它会很好地工作。
【讨论】:
【参考方案9】:您好,我使用的是完全符合 ANSI 的 Teradata 系统。使用双引号“”来命名这些列。
例如type
是 SQL 保留关键字,在引号内使用时,type
被视为用户指定的名称。
见以下代码示例:
CREATE TABLE alpha1
AS
(
SEL
product1
type_of_product AS "type"
FROM beta1
) WITH DATA
PRIMARY INDEX (product1)
--type is a SQL reserved keyword
TYPE
--see? now to retrieve the column you would use:
SEL "type" FROM alpha1
【讨论】:
我确认这在带有 Teradata 数据库的 DBeaver 中有效,谢谢!【参考方案10】:我在尝试更新名称为关键字的列时遇到了同样的问题。上面的解决方案对我没有帮助。我通过简单地指定表的名称来解决它:
UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')
【讨论】:
【参考方案11】:以下将完美运行:
SELECT DISTINCT table.from AS a FROM table
【讨论】:
【参考方案12】:您可以将列名放在括号中,例如:
Select [from] from < ur_tablename>
或者
放入临时表,然后随意使用。 示例:
Declare @temp_table table(temp_from varchar(max))
Insert into @temp_table
Select * from your_tablename
这里我只是假设 your_tablename 只包含一列(即来自)。
【讨论】:
假设[from]
是your_tablename
拥有的唯一列。
临时表有什么好处?好像完全没用,和问题一点关系都没有。
@rjmunro,不,这似乎并非完全没用。我有一个案例,我从 SQL 查询一个表格多维数据集,它返回像“[Total]”这样的列的名称。也就是说,名称本身包含“[”和“]”。您不能使用 [[Total]] 和 [Total] 来检索这样的列。最简单的方法是将查询结果放入临时表中。
@darlove 你不能使用引号:"[Total]"
?或者也许有办法逃脱它,比如[\[Total\]]
?
@rjmunro,在对此进行了一些实验之后,我发现了另一种我不知道的方法:您可以将 QUOTED_IDENTIFIER 设置为 ON,然后使用您所说的,双引用“。所以,这只是另一种方式,但我不会完全放弃临时表选项。【参考方案13】:
在 MySQL 中,除了使用反引号 (`),您还可以使用 UI 更改列名。右键单击表 > 更改表 > 编辑包含 sql 关键字的列名 > 提交。
select [from] from <table>
请注意,以上在 MySQL 中不起作用
【讨论】:
【参考方案14】:从这里的答案和我自己的经验来看。如果您打算实现可移植性,唯一可接受的答案是不要将 SQL 关键字用于表、列或其他名称。
所有这些答案都适用于各种数据库,但显然很多不支持 ANSI 解决方案。
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review @TanmayNehete 我的回答没有任何链接。要么你评论了错误的答案,要么选择了错误的解释?【参考方案15】:简单的解决方案
假设列名是 from ;所以查询中的列名可以通过表别名来引用
Select * from user u where u.from="US"
【讨论】:
【参考方案16】:在 Oracle SQL Developer pl/sql 中,您可以使用双引号来执行此操作,但如果使用双引号,则必须以大写形式键入列名。例如,从 MY_TABLE 中选择“FROM”
【讨论】:
以上是关于如何处理看起来像 SQL 关键字的 SQL 列名?的主要内容,如果未能解决你的问题,请参考以下文章