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

我的一个列被称为from。我不能改名字,因为不是我做的。 我被允许做一些像SELECT from FROM TableName或有一个特殊的语法,以避免SQL服务器被混淆?< / p >

403044 次浏览

将列名像这样用括号括起来,from就变成了[from]。

select [from] from table;

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

select table.[from] from table;

如果您正在使用SQL Server,您可以简单地将方括号括在列名或表名周围。

select [select]
from [table]

当你这样做的时候,把它别名为其他东西(或者更好的是,使用一个视图或SP并弃用旧的直接访问方法)。

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

你的问题似乎已经回答得很好了,但我想再补充一点。

那些设计数据库的人应该很清楚保留的关键字,并避免使用它们。如果你发现有人在使用它,告诉他们(以礼貌的方式)。这里的关键字是保留字。

更多信息:

"不应该使用保留的关键字 作为对象名。数据库升级 从早期版本的SQL Server 可能包含标识符,包括 话不保留在前面 版本,但那是保留的话 SQL Server的当前版本。 可以使用引用对象 分隔标识符直到名称 是可以改变的。” http://msdn.microsoft.com/en-us/library/ms176027.aspx < / p >

而且

"如果你的数据库包含名字 匹配保留关键字,您必须 使用分隔标识符时 引用这些对象。更多的 有关信息,请参见标识符(DMX)。 http://msdn.microsoft.com/en-us/library/ms132178.aspx < / p >

如果是在PostgreSQL中,在名字周围使用双引号,比如:

select "from" from "table";

注意:PostgreSQL内部自动将所有不带引号的命令和参数转换为小写。命令和标识符不区分大小写。sEleCt * from tAblE;被解释为Select * from table;。然而,双引号内的参数是按原样使用的,因此是区分大小写的:Select * from "table";select * from "Table";从两个不同的表中获取结果。

你可以像这样把你的列名放在括号里:

Select  [from] from < ur_tablename>

插入一个临时表,然后随意使用 例子:< / p >

Declare @temp_table table(temp_from varchar(max))


Insert into @temp_table
Select * from your_tablename

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

嗨,我在完全符合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

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

UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')
我也遇到过这个问题。 解决方案是在查询中放入[Column_Name],就像这样
string query= "Select [Name],[Email] from Person";

所以它会工作得很好。

下面的方法会很有效:

SELECT DISTINCT table.from AS a FROM table

以下是两种方法:

  1. 使用后面的引用如下:

从表名中选择“from”

  1. 你可以用表名提到:

SELECT TableName.from FROM TableName

在Apache Drill中,使用反引号:

select `from` from table;

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

select [from] from <table>

需要注意的是,上述方法在MySQL中不起作用

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

所有这些答案都适用于各种数据库,但显然有很多不支持ANSI解决方案。

在Oracle SQL Developer中,pl/ SQL可以使用双引号,但如果使用双引号,则必须以大写字母输入列名。例如,SELECT "FROM"从MY_TABLE

简单的解决方案

假设列名是;因此,查询中的列名可以通过表别名引用

Select * from user u where u.from="US"

一些可靠的答案——但投票最多的答案是狭隘的,只涉及SQL Server。总而言之:

  • 如果你有源代码控制,最好的解决方案是坚持规则,避免使用保留词。这个列表已经存在了很长时间,并且涵盖了大多数的特性。一个技巧是保留词很少是复数,所以使用复数名称通常是安全的。例外的有DIAGNOSTICS、SCHEMAS、OCTETS、offset、OPTIONS、VALUES、PARAMETERS、PRIVILEGES以及类似动词的词,它们也是复数形式:OVERLAPS、READS、RETURNS、TRANSFORMS。
  • 我们中的许多人都没有改变字段名称的特权。在那里,你需要知道你正在访问的RDBM的详细信息:
  • 对于SQL Server,在名称周围使用[square_braces]。这也适用于ODBC连接。
  • 对于MySQL使用' back_ticks '。
  • Postgres, Oracle和其他一些RDBMs显然将允许“双引号”;被使用。

在表名上加上冒犯性的单词也可以。