如何处理看起来像SQL关键字的SQL列名?


226

我的其中一列称为from。我无法更改名称,因为我没有这么做。我是否可以做类似的事情,SELECT from FROM TableName或者是否有特殊的语法来避免SQL Server混淆?


3
我会说使用ANSI SQL的双引号作为分隔标识符。它可以在几乎所有的dbms上运行,包括SQL Server。即简单地做SELECT "from" FROM TableName,好携带!
jarlh 18-4-17

Answers:


354

像这样将列名称括在方括号中,from成为[from]。

select [from] from table;

也可以使用以下命令(在查询多个表时很有用):

select table.[from] from table;

10
关于什么:select TableName.from from TableName; PS:它适用于MySQL
Fabricio PH

1
我只是在今天早上尝试过此方法,但在我的MySQL安装中似乎没有起作用。它是参数还是打开它的东西?
CodeChimp

@CodeChimp-尝试使用反引号,stackoverflow.com /questions/ 2901453 /…此问题/答案特定于MS SQL Server。
tvanfosson

是的,但是@FabricioPH提到了它可以在MySQL中运行。我在本地MySQL安装上尝试此操作后,在Google搜索中碰巧遇到了这个问题。我一直在寻找是否有通用的ANSI SQL方式在SQL中转义此类内容。我们目前正在使用SQL Server 2005,但在其他一些应用程序中也使用了Oracle。我们希望以这样的方式对Java DAO进行编码:如果有人被告知要从SQL Server迁移到其他版本,那么它将“起作用”。
CodeChimp

@CodeChimp我可以数指不觉地发生在我身上的次数。:)
tvanfosson

25

如果它已经存在于PostgreSQL中,请在名称周围使用双引号,例如:

select "from" from "table";

注意:PostgreSQL内部自动将所有未加引号的命令和参数转换为小写。其结果是命令和标识符不区分大小写。表*来自表;解释为表中的select *;。但是,双引号内的参数按原样使用,因此区分大小写:select * from“ table”; 然后从“表格”中选择*;从两个不同的表中获取结果。


但是,双引号也适用于MS SQL,但不区分大小写。带引号的标识符只是AFAIK,是括号分隔标识符的等效替代。
P爸爸

双引号也适用于Amazon的Athena使用的Presto SQL查询引擎。
Will Humphreys

21

在执行此操作时-将其作为其他别名(或者更好的方法是,使用视图或SP并弃用旧的直接访问方法)。

SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName

14

这是两种方法:

  1. 在此处使用反引号:

从TableName中选择`from`

  1. 您可以使用表名提及:

SELECT TableName.from FROM TableName


谢谢!这保存了我的Google表格查询,该查询试图从BY列中提取
Paul

1
谢谢,双引号和方括号语法不适用于我的客户端(MySQLWorkbench),但反勾方法却适用。
kingInTheNorth '19

10

您的问题似乎在这里得到了很好的回答,但是我只想对此主题再添加一条评论。

设计数据库的人员应充分了解保留的关键字,并避免使用它们。如果您发现有人在使用它,请以礼貌的方式告知他们。此处的关键字是保留字。

更多信息:

“保留的关键字不应用作对象名称。从早期版本的SQL Server升级的数据库可能包含标识符,这些标识符包括早期版本中未保留的单词,但对于当前版本的SQL Server是保留的单词。您可以参考对象,方法是使用带分隔符的标识符,直到可以更改名称为止。” http://msdn.microsoft.com/en-us/library/ms176027.aspx

“如果数据库确实包含与保留关键字匹配的名称,则在引用这些对象时必须使用定界标识符。有关更多信息,请参见标识符(DMX)。” http://msdn.microsoft.com/en-us/library/ms132178.aspx


2
更好的是,始终对数据库对象使用括号。
2013年

8

如果您使用的是SQL Server,则只需将方括号括在列名或表名上即可。

select [select]
from [table]

5

在Apache Drill中,使用反引号:

select `from` from table;

3

我也遇到了这个问题。解决此问题的方法是在查询中放入这样的[Column_Name]。

string query= "Select [Name],[Email] from Person";

因此它将很好地工作。


3

嗨,我在完全符合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中使用此功能,谢谢!
保罗

1

您可以将列名放在方括号中,例如:

Select  [from] from < ur_tablename>

要么

放入临时表,然后根据需要使用。
例:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

在这里,我只是假设your_tablename仅包含一列(即from)。


3
假定这[from]是唯一获得的列your_tablename
Andriy M 2012年

您从临时表中获得什么?似乎完全没有用,与这个问题完全无关。
rjmunro

@rjmunro,不,这似乎完全没有用。我有一种情况,我从SQL查询表格形式的多维数据集,并且它返回列名称,例如“ [Total]”。也就是说,名称本身包含'['和']'。您无法使用[[Total]]和[Total]来检索此类列。最简单的方法是将查询结果放入临时表中。
darlove

@darlove您不能使用引号:"[Total]"吗?或者也许有一种方法可以逃脱它,例如[\[Total\]]
rjmunro

@rjmunro,在进行了一些实验之后,我发现了另一种我不知道的方式:您可以将QUOTED_IDENTIFIER设置为ON,然后使用您正在谈论的内容,双引号“。所以,这只是另一种方式,但我不会完全放弃临时表选项
darlove

1

尝试更新名称为关键字的列时,我遇到了同样的问题。上面的解决方案对我没有帮助。我通过简单地指定表名来解决了这个问题:

UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')

1

以下将完美地工作:

SELECT DISTINCT table.from AS a FROM table

1

在MySQL中,除了使用反引号(`)之外,还可以使用UI更改列名。右键单击表>更改表>编辑包含sql关键字的列名>提交。

select [from] from <table>

请注意,以上内容在MySQL中不起作用


1

从这里的答案和我自己的经验来看。如果您打算移植,唯一可接受的答案是不要对表,列或其他名称使用SQL关键字。

所有这些答案都可以在各种数据库中使用,但显然很多都不支持ANSI解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.