2012-12-06 108 views
2

SQL中的查詢字符串apostrophequotation mark中的哪些角色? apostrophe如何更換?PostgreSQL中的撇號和引用 - 如何替換撇號?

主要興趣是他們在PostgreSQL中的特定角色。

離開apostrophe出混亂的SQL查詢,e.g ,:

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

+1

請顯示您的確切**表定義**,以便我們知道標識符是否實際上是大寫字母。還有你的PostgreSQL版本。 –

+0

表中沒有「角色」欄? –

回答

7

可以更換單引號')與PostgreSQL的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

而且一旦您使用美元引用代替單引號,則可能使用單引號而不是單引號雙引號圍繞整個SQL字符串,允許在需要時直接使用雙引號。 – qqx

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" 
+0

擴展了我的答案 –

+0

有沒有辦法避免值中的'?'? – jacktrades

+0

所以這個問題實際上是關於jboss配置?對於雙引號,你難道不能逃脫它們嗎?而''',你不能只是省略引號嗎?以這種方式接受參數的普通系統包括所需的任何內容(例如單引號和轉義值不會中斷查詢),具體取決於您提供的值的類型。 –

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

這單引號指的是字符串。

當您試圖直接對字符串進行操作時,需要使用這些引號。 除了如果你正在處理String對象之外,不需要引號,你可以直接使用該對象。

由於您正在使用單引號(')直接引用列中的字符串,所以使用雙引號(「)來引用表對象。(您可以直接引用的表名不帶任何引號)

擴展爲:

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

這裏「管理員」是一個直接的字符串,它是一個單元的相應列中的值。

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

這裏string_object是存儲一些字符串的對象,存儲的字符串表示相應列中的一個單元格的值。

+1

好,仍然不能在XML文件中包含該查詢 – jacktrades

+0

您可以顯示您的XML文件的外觀如何。 –

0

可以通過向它添加另一個撇號替換撇號。

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