【问题标题】:Apostrophe and Quotation in PostgreSQL -How to replace Apostrophe?PostgreSQL 中的撇号和引号 - 如何替换撇号?
【发布时间】:2012-12-06 11:23:27
【问题描述】:

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。

【问题讨论】:

  • 请显示您的确切表定义,以便我们知道标识符是否实际上是大写字母。还有你的 PostgreSQL 版本。
  • 您的表中没有“ROLES”列?

标签: sql postgresql syntax case-sensitive


【解决方案1】:

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

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

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

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

【讨论】:

  • 一旦您使用美元引号代替单引号,您可能会在整个 SQL 字符串周围使用单引号而不是双引号,从而允许在需要时直接使用双引号。
【解决方案2】:
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是存储某个字符串的对象,存储的字符串代表相应列中一个单元格的值。

【讨论】:

  • 很好,仍然不能在 XML 文件中包含该查询
【解决方案3】:

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

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

所以无效:

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"

【讨论】:

  • 有没有办法避免值中的''?
  • 那么问题其实是关于jboss配置的?对于双引号,你不能逃避它们吗?而对于“?”,你不能省略引号吗?以这种方式接受您的参数的正常系统包括所需的任何内容(例如单引号和转义值以不破坏查询),具体取决于您提供的值的类型。
  • 虽然,我使用的系统不允许我使用大写字母而不是转义表名。重新命名您的表,或创建小写的方法/视图。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多