2012-04-17 13 views
27

Mam tabeli, która ma 20 kolumn liczb całkowitych i 1 kolumny tekstu o nazwie 'foo'PostgreSQL column 'foo' nie istnieje

Jeśli uruchomić kwerendę:

SELECT * from table_name where foo is NULL 

otrzymuję błąd:

ERROR: column "foo" does not exist 

Sprawdziłem, że jego kolumna rzeczywiście istnieje. Jeśli robię coś takiego:

SELECT * from table_name where count is NULL 

Wynikiem pojawi się napis „foo” jako jednej z kolumn .... Domyślam muszę zrobić coś szczególnego w zapytaniu ponieważ foo jest kolumna tekstu .. .

Dzięki za pomoc (PostgreSQL 8.3)

+1

Co widzisz, jeśli przejdziesz do psql i wpisz "\ d nazwa_tabeli"? –

+2

Jak stworzyłeś kolumnę? Czy został stworzony jako '" Foo "' lub '" Foo "' lub podobny? –

+0

@PaulTomblin Mam dostęp za pomocą phpPGmyadmin, nie mam dostępu do wiersza cmd. – nulltorpedo

Odpowiedz

27

Przypadkowo utworzonych nazwę kolumny ze spacją i przypuszczalnie phpPgAdmin utworzonych nazwę kolumny z podwójnym cytaty wokół niego:

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

że daje kolumnę, który wyglądał jak to nazwano foo wszędzie, ale trzeba by podwoić cytatem t i obejmuje przestrzeń ilekroć go używać:

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

Najlepszą praktyką jest stosowanie niższej przypadków nienotowanych nazwy kolumn z PostgreSQL.Powinno być gdzieś miejsce w phpPGadmin, które powie mu, by nie podawało identyfikatorów (takich jak nazwy tabel i kolumn), ale niestety nie używam phpPGadmin, więc nie mam tam gdzie to ustawienie (lub nawet jeśli istnieje).

26

Jeśli z jakiegoś powodu stworzyły mieszane sprawy lub dużymi literami nazwę kolumny, trzeba go zacytować, lub uzyskać ten błąd:

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=> _ 

Zwróć uwagę, jak komunikat o błędzie podaje wielkość liter w cudzysłowach.

18

PostreSQL najwyraźniej konwertuje nazwy kolumn na małe litery w zapytaniu sql - Widziałem problemy, w których nazwy kolumn mieszanych przypadków dadzą ten błąd. Można to naprawić poprzez umieszczenie nazwy kolumny w cudzysłowach:

SELECT * FROM table_name where "Foo" IS NULL 
+0

To jest odpowiedź, która naprawiła to za mnie. Trochę dziwnego dziwactwa Postgresa, aby ukryć nazwy kolumn na małe litery, ale wymagają dokładnego dopasowania do przypadku. Dzięki! –

4

Jak inni sugerowane w komentarzach, to prawdopodobnie kwestia górnej przypadku kontra małymi literami lub jakimś spacji w nazwie kolumny. (. Używam odpowiedź więc mogę sformatować jakieś próbki kodu) Aby zobaczyć, jakie nazwy kolumn są naprawdę, spróbuj uruchomić tę kwerendę:

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

Należy prawdopodobnie również sprawdzić logi serwera PostgreSQL, jeśli możesz, aby zobaczyć, co zawiera raport.

Jeśli podajesz identyfikator, wszystko w cudzysłowach jest częścią identyfikatora, w tym wielkich liter, zakończenia linii, spacji i znaków specjalnych. Jedynym wyjątkiem jest to, że dwa sąsiednie znaki cudzysłowu są traktowane jako sekwencja escape dla jednego cudzysłowu. Gdy identyfikator ma wartość , a nie w cudzysłowie, wszystkie litery są składane na małe litery. Oto przykład z normalnego zachowania:

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; 
          ^

Zapytanie pokazałem na najwyższych plonów to:

?column? | char_length 
-----------+------------- 
"alpha" |   5 
"bravo" |   5 
"Charlie" |   7 
"delta " |   6 
(4 rows) 
3

To mogą być same cytaty, które stanowią cały problem. Miałem podobny problem i było to spowodowane cytatami wokół nazwy kolumny w instrukcji CREATE TABLE. Zauważ, że nie było żadnych problemów, tylko cytaty powodujące problemy.

Kolumna wyglądała tak, jakby była nazywana anID, ale naprawdę została nazwana "anID". Cytaty nie pojawiają się w typowych zapytaniach, więc trudno je było wykryć (dla tego żółtodzioba). Jest to na PostgreSQL 9.4.1

Niektóre bardziej szczegółowo:

Doing postgres=# SELECT * FROM test; dał:

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

ale próbuje wybrać tylko pierwsza kolumna SELECT anID FROM test; spowodowało błąd:

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

Po prostu szukanie nazw kolumn nie pomogło: postgres=# \d test;

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

ale w pgAdmin po kliknięciu na nazwę kolumny i patrzeć w okienku SQL ona wypełniona:

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

i oto istnieją quoutes wokół nazwy kolumny. Tak więc ostatecznie postgres=# select "anID" FROM test; działa dobrze:

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

samo moralne, nie należy używać cudzysłowów.

1

Naprawiłem go przez zmianę znaku cudzysłowu (") z apostrofu (') wewnątrz wartości dla np.

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

staje się w ten sposób:

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

Zakładając, że kolumna datetime jest VarChar.

1

Wystąpił ten problem podczas tworzenia tabeli przy użyciu klienta phppgadmin. W phppgadmin nie podaliśmy podwójnych cudzysłowów w nazwie kolumny, a mimo to napotkaliśmy ten sam problem.

Tworzymy kolumnę z przypadkiem caMel, a następnie phpPGAdmin niejawnie dodaje podwójne cudzysłowy wokół nazwy kolumny. Jeśli utworzysz kolumnę ze wszystkimi małymi literami, nie natkniesz się na ten problem.

Możesz zmienić kolumnę w phppgadmin i zmienić nazwę kolumny na wszystkie małe litery, aby ten problem zniknął.

+1

Zgodnie z twoją odpowiedzią, uważasz, że problem może polegać na tym, że nazwa kolumny nie jest "foo". Powinieneś wtedy wyraźnie powiedzieć to i może zostać poproszony o wynik wyciągu select z miejsca, w którym widziałeś, jak został utworzony. Tylko dlatego, że tak właśnie jest. Dobrą praktyką jest zapewnienie rozwiązania tej sprawy, zgodnie z propozycją odpowiedzi. Dlatego edytuj swoją odpowiedź, aby zapewnić bardziej pomocne rozwiązanie. – iOS

0

Naprawiłem podobne problemy przez qutating nazwę kolumny

SELECT * from table_name where "foo" is NULL; 

W moim przypadku to był tylko

SELECT id, "foo" from table_name; 

bez cudzysłowów I'v got ten sam błąd.

Powiązane problemy