如何处理看起来像是SQL关键字的SQL列名?
在使用SQL时,有时会遇到列名与SQL关键字冲突的情况。下面是两种解决方法:
1. 使用反引号(back quote)来标识列名,例如:
SELECT `from` FROM TableName
通过使用反引号,可以将列名作为普通的标识符来处理,从而避免与SQL关键字的冲突。
2. 可以在列名前面加上表名来进行区分,例如:
SELECT TableName.from FROM TableName
通过在列名前面加上表名,可以明确指定要查询的是哪个表的哪个列,从而避免与SQL关键字的冲突。
感谢提问者的建议,双引号和方括号的语法在我的客户端(MySQLWorkbench)中无效,但使用反引号的方法有效。
解决 SQL 列名与关键字冲突的问题的方法是在列名周围使用双引号。在 PostgreSQL 中,可以使用以下语法:
select "from" from "table";
需要注意的是,在 PostgreSQL 内部,所有未加引号的命令和参数都会自动转换为小写。这意味着命令和标识符不区分大小写。例如,sEleCt * from tAblE; 会被解释为 select * from table;。然而,双引号内的参数会保持原样,因此是区分大小写的。例如,select * from "table"; 和 select * from "Table"; 会从两个不同的表中获取结果。
双引号也适用于 MS SQL,但不区分大小写。引号括起来的标识符只是等效于方括号括起来的标识符的替代方式。
在由亚马逊 Athena 使用的 Presto SQL 查询引擎中,双引号也适用。
如何处理看起来像SQL关键字的SQL列名?
在SQL查询中使用方括号将列名包裹起来,如
[from]
。
select [from] from table;
在查询多个表时,也可以使用以下方法:
select table.[from] from table;
对于MySQL,可以尝试以下方法:
select TableName.from from TableName;
但是,这种方法在我的MySQL安装中似乎不起作用。是否有参数或其他方法可以打开此功能?
可以尝试使用反引号,参考stackoverflow.com/questions/2901453/…,这个问题和答案是针对MS SQL Server的。
但是,我提到了在MySQL中可以工作。我在本地MySQL安装中尝试后,通过谷歌搜索找到了这里。我想知道是否有一种通用的ANSI SQL方式可以转义SQL中的这种内容。我们目前正在使用SQL Server 2005,但是我们的其他应用程序中也使用了Oracle。我们希望以这种方式编写Java DAO,以便如果我们被告知从SQL Server迁移到其他数据库,它可以正常工作。
我从来没有遇到过这种情况。:)
你提供的不使用方括号的tablename.columnname
的解决方案似乎在SQL Server 2017中不起作用。但使用方括号的方法是可以的。
通常情况下,对于任何与SQL Server命令相同的列名,都需要使用方括号,如TableName.[from]
。