如何处理看起来像 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 列名?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理以保留 Sql 关键字命名的表列?

如何处理sql中的关键字(例如',%)

旧网站存在安全问题如何处理?

Wordpress SQL 默认搜索,如何处理 SQL 注入

如何处理耗时的 SQL?

如何处理 SQL 代理作业错误?