PostgreSQL中的撇号和报价 - 如何取代撇号?

时间:2012-12-06 11:23:28

标签: sql postgresql syntax case-sensitive

SQL中apostrophequotation mark的查询字符串中的角色是什么?如何替换apostrophe

主要兴趣是他们在PostgreSQL中的特定角色。

apostrophe混淆SQL查询,例如:

SELECT role FROM "USER_ROLES" WHERE "USER_ROLES".login = admin;

当admin是值时,获取'列'管理员不存在错误。写'admin'可以解决问题:

SELECT role FROM "USER_ROLES" WHERE "USER_ROLES".login = 'admin';

实际问题是在另一个上下文中使用该查询:

<module-option name="rolesQuery" value="SELECT 'role', 'Roles' FROM &quot;USER_ROLES&quot; WHERE login='?'"/>

根据要求,表格定义为:

CREATE TABLE "USER_ROLES" (
  login text NOT NULL,
  role text,
  CONSTRAINT "USER_ROLES_pkey" PRIMARY KEY (login ),
  CONSTRAINT "USER_ROLES_login_fkey" FOREIGN KEY (login)
      REFERENCES "USER" (login) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

PostgreSQL版本9.1。

4 个答案:

答案 0 :(得分:8)

您可以在PostgreSQL中将{strong>单引号(')替换为dollar-quoting,以避免它们在不同的上下文中的特殊含义。 (不过,不确定美元符号是否也有特殊含义):

<module-option name="rolesQuery" value="SELECT role FROM &quot;USER_ROLES&quot; WHERE login = $$?$$"/>

另一个想法是使用&apos;代替单引号:

<module-option name="rolesQuery" value="SELECT role FROM &quot;USER_ROLES&quot; WHERE login = &apos;?&apos;"/>

答案 1 :(得分:3)

SELECT role FROM "USER_ROLES" WHERE "USER_ROLES".login = 'admin';

这个单引号是指字符串。

当你试图直接对字符串进行操作时,这些引号是必需的。 除了处理String对象之外,不需要引号,可以直接使用该对象。

当您使用单引号(')直接在列中引用字符串时,双引号(“)用于引用表对象。(您可以直接引用表名而不带任何引号)

扩展:

SELECT role FROM "USER_ROLES" WHERE "USER_ROLES".login = 'admin';

此处'admin'是一个直接字符串,它是相应列中一个单元格的值。

var string_object = 'admin';
SELECT role FROM "USER_ROLES" WHERE "USER_ROLES".login = string_object;

这里string_object是存储某些字符串的对象,而存储的字符串表示相应列中一个单元格的值。

答案 2 :(得分:2)

单个撇号(')用于字符串。

当您省略撇号时,解释器会将其视为名称,并尝试查找与该名称相关联的值(通常是列)。

无效:

SELECT *
FROM yourtable
WHERE yourcolumn = xyz -- fails because there is no column named xyz
                       -- also, if it would exist, it would compare to the
                       -- value in that column rather than to the value 'xyz'

并且有效:

SELECT *
FROM yourtable
WHERE yourcolumn = 'xyz'

引号(")用于数据库中的名称。

原因是PostgreSQL不接受表名(和列名等)中的大写字母,除非你把它们放在引号中。您也可以将它们放在小写名称旁边,在这种情况下没有区别。此外,这允许您使用保留名称作为表名或列名。因此"index"可以用作列名,因为引号表示名称。使用不带引号的index表示处理索引的保留字。

所以,这是无效的:

SELECT index -- invalid, reserved name
FROM YourTable -- invalid, capital letters

这是有效的:

SELECT "index"
FROM "YourTable"

答案 3 :(得分:0)

你可以通过添加另一个撇号替换撇号。

select replace('hi''','''','m')--  replaces apostrophe with m.