3

apostropheSQL的查询字符串和quotation markSQL中的角色是什么?怎么可能apostrophe被替换?

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

省略apostrophe混乱的 SQL 查询,例如:

SELECT role FROM "USER_ROLES" WHERE "USER_ROLES".login = 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

4 回答 4

9

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

<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;"/>
于 2012-12-06T12:29:13.897 回答
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 是存储一些字符串的对象,存储的字符串代表相应列中一个单元格的值。

于 2012-12-06T11:35:07.967 回答
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"
于 2012-12-06T11:31:53.103 回答
0

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

select replace('hi''','''','m')--  replaces apostrophe with m.
于 2016-12-20T10:05:36.987 回答