3

apostropheおよびquotation markSQLのクエリ文字列の役割はどれですか? どのapostropheように交換できますか?

主な関心は、PostgreSQL での特定の役割です。

混乱apostropheした SQL クエリを除外すると、次のようになります。

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

admin が値の場合、'column' admin does not exist エラーを取得します。「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

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

この一重引用符は文字列を参照します。

文字列を直接操作しようとするときはいつでも、これらの引用符が必要です。String オブジェクトを扱っている場合以外は、引用符は必要ありません。オブジェクトを直接使用できます。

列内の文字列を直接参照するために一重引用符 (') を使用しているため、テーブル オブジェクトを参照するには二重引用符 (") を使用します (引用符なしでテーブル名を直接参照できます)。

拡張:

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

ここで「admin」は直接の文字列で、それぞれの列の 1 つのセルの値です。

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

ここで、string_object は文字列が格納されるオブジェクトであり、その格納された文字列はそれぞれの列の 1 つのセルの値を表します。

于 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 に答える