60

'foo'という名前の20個の整数列と1個のテキスト列を持つテーブルがあります

クエリを実行した場合:

SELECT * from table_name where foo is NULL

エラーが発生します:

ERROR:  column "foo" does not exist

彼のコラムが実際に存在することを確認しました。私が次のようなことをした場合:

SELECT * from table_name where count is NULL

結果の出力には、列の1つとして「foo」が表示されます。fooはテキスト列であるため、クエリで何か特別なことをしなければならないと思います。

ヘルプをありがとう(POSTGRESQL 8.3)

4

12 に答える 12

46

誤って末尾にスペースを付けて列名を作成し、おそらくphpPGadminがその前後に二重引用符を付けて列名を作成しました。

create table your_table (
    "foo " -- ...
)

これにより、どこでも呼び出されたように見える列が得られますがfoo、二重引用符で囲み、使用するたびにスペースを含める必要があります。

select ... from your_table where "foo " is not null

ベストプラクティスは、PostgreSQLで引用符で囲まれていない小文字の列名を使用することです。phpPGadminには、識別子(テーブル名や列名など)を引用しないように指示する設定があるはずですが、残念ながら、私はphpPGadminを使用しないため、その設定がどこにあるか(または存在する場合でも)は使用しません。

于 2012-04-18T00:38:32.120 に答える
41

何らかの理由で大文字と小文字が混在する列名または大文字の列名を作成した場合は、引用符で囲む必要があります。そうしないと、次のエラーが発生します。

test=> create table moo("FOO" int);
CREATE TABLE
test=> select * from moo;
 FOO 
-----
(0 rows)
test=> select "foo" from moo;
ERROR:  column "foo" does not exist
LINE 1: select "foo" from moo;
               ^
test=> _

エラーメッセージが大文字と小文字をどのように示しているかに注意してください。

于 2012-04-18T00:15:54.590 に答える
35

PostreSQLは、SQLクエリで列名を小文字に変換するようです-大文字と小文字が混在する列名でそのエラーが発生する問題を確認しました。列名を引用符で囲むことで修正できます。

SELECT * FROM table_name where "Foo" IS NULL
于 2012-04-18T00:20:31.130 に答える
9

値内のアポストロフィ' )で引用符")を変更することで修正しました。例:

insert into trucks ("id","datetime") VALUES (862,"10-09-2002 09:15:59");

これになります:

insert into trucks ("id","datetime") VALUES (862,'10-09-2002 09:15:59');

datetime列がVarCharであると仮定します。

于 2015-11-17T03:08:19.397 に答える
5

他の人がコメントで示唆しているように、これはおそらく大文字と小文字、または列名の空白の問題です。(いくつかのコードサンプルをフォーマットできるように、回答を使用しています。)列名が実際に何であるかを確認するには、次のクエリを実行してみてください。

SELECT '"' || attname || '"', char_length(attname)
  FROM pg_attribute
  WHERE attrelid = 'table_name'::regclass AND attnum > 0
  ORDER BY attnum;

可能であれば、PostgreSQLサーバーログもチェックして、ステートメントのレポート内容を確認する必要があります。

識別子を引用符で囲む場合、大文字、行末、スペース、特殊文字など、引用符で囲まれたすべてのものが識別子の一部になります。唯一の例外は、隣接する2つの引用文字が1つの引用文字のエスケープシーケンスと見なされることです。識別子が引用符で囲まれていない場合、すべての文字は小文字に折りたたまれます。通常の動作の例を次に示します。

test=# create table t (alpha text, Bravo text, "Charlie" text, "delta " text);
CREATE TABLE
test=# select * from t where Alpha is null;
 alpha | bravo | Charlie | delta  
-------+-------+---------+--------
(0 rows)

test=# select * from t where bravo is null;
 alpha | bravo | Charlie | delta  
-------+-------+---------+--------
(0 rows)

test=# select * from t where Charlie is null;
ERROR:  column "charlie" does not exist
LINE 1: select * from t where Charlie is null;
                              ^
test=# select * from t where delta is null;
ERROR:  column "delta" does not exist
LINE 1: select * from t where delta is null;
                              ^

私が一番上に示したクエリはこれをもたらします:

 ?column?  | char_length 
-----------+-------------
 "alpha"   |           5
 "bravo"   |           5
 "Charlie" |           7
 "delta "  |           6
(4 rows)
于 2012-04-18T00:34:12.297 に答える
4

全体の問題は引用符自体である可能性があります。同様の問題が発生しました。これは、CREATETABLEステートメントの列名を引用符で囲んだことが原因でした。空白の問題はなく、引用符だけが問題を引き起こしていることに注意してください。

コラムは呼ばれたように見えましanIDたが、実際にはと呼ばれていました"anID"。引用符は通常のクエリには表示されないため、検出が困難でした(このpostgresの新人の場合)。これはpostgres9.4.1にあります

詳細:

与えpostgres=# SELECT * FROM test;た:

  anID | value 
 ------+-------
     1 | hello
     2 | baz
     3 | foo (3 rows)

しかし、最初の列だけを選択しようとするとSELECT anID FROM test;、エラーが発生しました。

ERROR:  column "anid" does not exist 
LINE 1: SELECT anID FROM test;
                ^

列名を見ただけでは役に立ちませんでした。 postgres=# \d test;

          Table "public.test"
 Column |       Type        | Modifiers 
--------+-------------------+-----------
 anID   | integer           | not null
 value  | character varying | 
Indexes:
    "PK on ID" PRIMARY KEY, btree ("anID")

しかし、pgAdminでは、列名をクリックしてSQLペインを見ると、次のように表示されます。

ALTER TABLE test ADD COLUMN "anID" integer;
ALTER TABLE test ALTER COLUMN "anID" SET NOT NULL;

そして、見よ、列名の周りに定足数がある。したがって、最終的には正常にpostgres=# select "anID" FROM test;機能します。

 anID 
------
    1
    2
    3
(3 rows)

同じ道徳、引用符を使用しないでください。

于 2015-04-10T21:53:35.593 に答える
4

この問題は、列の名前が内部的にキャメルケースであるために発生します。これを解決するために、列を ""(二重引用符)で囲みます。テーブルに値を挿入するときは、一重引用符('')を使用してください。

例: schema_name.table_nameに挿入values(''、''、'');

于 2018-06-29T08:55:57.037 に答える
3

私の場合、select queryを実行すると、それが機能し、必要なデータが得られます。しかし、私が次のようなクエリを実行すると

select * from users where email = "user@gmail.com"

このエラーを示しています

ERROR:  column "user@gmail.com" does not exist
LINE 2: select * from users where email = "user@gmail.com...
                                          ^
SQL state: 42703
Character: 106

次に、一致条件に二重引用符の代わりに一重引用符を使用します。これは機能します。例:

select * from users where email = 'user@gmail.com'
于 2021-01-11T10:30:20.493 に答える
2

phppgadminクライアントを使用してテーブルを作成したときに、この問題が発生しました。phppgadminでは、列名に二重引用符を指定しませんでしたが、それでも同じ問題が発生しました。

キャメルケースを使用して列を作成すると、phpPGAdminは列名の前後に二重引用符を暗黙的に追加します。すべて小文字の列を作成する場合、この問題は発生しません。

phppgadminで列を変更し、列名をすべて小文字に変更すると、この問題は解消されます。

于 2015-11-25T23:06:49.960 に答える
2

列名を引用して同様の問題を修正しました

SELECT * from table_name where "foo" is NULL;

私の場合、それはただでした

SELECT id, "foo" from table_name;

引用符なしで同じエラーが発生します。

于 2018-03-02T07:07:02.933 に答える
0

また、Dapperを使用していて、パラメーター化された値を入力するのを忘れたときに、このエラーが発生しました。

修正するには、パラメーターとして渡されたオブジェクトに、SQL文字列のパラメーター化された値と一致するプロパティがあることを確認する必要がありました。

于 2020-09-24T05:52:58.973 に答える
0

私はアドレスデータを使用しており、パンダを使用してデータをPostgresにロードしています。pandas_usaddressライブラリは私のアドレスを解析するのに素晴らしい仕事をしましたが、新しい列をInSpeCificの場合に入れました。クレイジー。ただし、各列名には二重引用符を使用する必要があります。har_addressesから「ZipCode」を選択します。そして、私は自分のデータを取得します。

于 2021-10-11T10:58:41.503 に答える