SQL中apostrophe
和quotation 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 "USER_ROLES" 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。
答案 0 :(得分:8)
您可以在PostgreSQL中将{strong>单引号('
)替换为dollar-quoting,以避免它们在不同的上下文中的特殊含义。 (不过,不确定美元符号是否也有特殊含义):
<module-option name="rolesQuery" value="SELECT role FROM "USER_ROLES" WHERE login = $$?$$"/>
另一个想法是使用'
代替单引号:
<module-option name="rolesQuery" value="SELECT role FROM "USER_ROLES" WHERE login = '?'"/>
答案 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.