2012-04-17 41 views
27

Tôi đã một bảng có 20 cột số nguyên và 1 cột văn bản có tên là 'foo'PostgreSQL cột 'foo' không tồn tại

Nếu tôi chạy truy vấn:

SELECT * from table_name where foo is NULL 

tôi nhận được lỗi:

ERROR: column "foo" does not exist 

Tôi đã tự kiểm tra rằng cột của anh ấy thực sự tồn tại. Nếu tôi làm điều gì đó như:

SELECT * from table_name where count is NULL 

Các kết quả đầu ra chương trình 'foo' là một trong những cột .... Tôi đoán tôi phải làm một cái gì đó đặc biệt trong truy vấn vì foo là một cột văn bản .. .

Thanks for the help (PostgreSQL 8.3)

+1

Bạn thấy gì nếu bạn vào psql và gõ "\ d table_name"? –

+2

Bạn đã tạo cột như thế nào? Nó được tạo ra là '" Foo "' hay '" Foo "' hay tương tự? –

+0

@PaulTomblin Tôi đang truy cập bằng phpPGmyadmin, không có quyền truy cập vào dòng cmd. – nulltorpedo

Trả lời

27

Bạn vô tình tạo ra các tên cột với một không gian dấu và có lẽ phpPgAdmin tạo tên cột với đôi báo giá xung quanh nó:

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

Điều đó sẽ cung cấp cho bạn một cột trông giống như được gọi là foo ở mọi nơi nhưng bạn phải báo giá gấp đôi i và bao gồm khoảng trắng bất cứ khi nào bạn sử dụng:

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

Cách tốt nhất là sử dụng tên cột không được kiểm soát bằng chữ thường với PostgreSQL.Nên có một thiết lập trong phpPGadmin ở đâu đó sẽ báo cho nó không phải định danh báo giá (chẳng hạn như tên bảng và cột) nhưng than ôi, tôi không dùng phpPGadmin vì vậy tôi không cài đặt ở đâu (hoặc thậm chí nếu nó tồn tại).

26

Nếu vì một số lý do bạn đã tạo ra một hỗn hợp hợp cụ thể hoặc chữ hoa tên cột, bạn cần phải trích dẫn nó, hoặc nhận được lỗi này:

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

Lưu ý cách thông báo lỗi cho trường hợp trong dấu ngoặc kép.

18

PostreSQL dường như chuyển đổi tên cột thành chữ thường trong truy vấn sql - Tôi đã thấy các vấn đề trong đó tên cột hỗn hợp sẽ cho lỗi đó. Bạn có thể sửa lỗi bằng cách đặt tên cột trong dấu ngoặc kép:

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

Đây là câu trả lời đã sửa cho tôi. Loại một Postgres quirk kỳ quặc để bí mật các tên cột xuống chữ thường nhưng yêu cầu khớp chính xác với trường hợp. Cảm ơn! –

4

Như những người khác được đề xuất trong nhận xét, đây có thể là vấn đề viết hoa so với chữ thường hoặc một số khoảng trắng trong tên cột. (Tôi đang sử dụng câu trả lời để tôi có thể định dạng một số mẫu mã.) Để xem tên cột thực sự là gì, hãy thử chạy truy vấn này:

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

Bạn cũng nên kiểm tra nhật ký máy chủ PostgreSQL nếu có thể, để xem những gì nó báo cáo cho tuyên bố.

Nếu bạn trích dẫn số nhận dạng, mọi thứ trong dấu ngoặc kép là một phần của số nhận dạng, bao gồm ký tự viết hoa, kết thúc dòng, dấu cách và ký tự đặc biệt. Ngoại lệ duy nhất là hai ký tự trích dẫn liền kề được lấy làm chuỗi thoát cho một ký tự trích dẫn. Khi số nhận dạng là không phải là trong dấu ngoặc kép, tất cả các chữ cái được xếp thành chữ thường. Dưới đây là một ví dụ về hành vi bình thường:

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

Truy vấn tôi đã giới thiệu tại sản lượng hàng đầu này:

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

Có thể báo giá chính họ là toàn bộ vấn đề. Tôi đã có một vấn đề tương tự và đó là do dấu ngoặc kép xung quanh tên cột trong câu lệnh CREATE TABLE. Lưu ý rằng không có vấn đề khoảng trắng, chỉ trích dẫn gây ra vấn đề.

Cột trông giống như được gọi là anID nhưng thực sự được gọi là "anID". Các trích dẫn không xuất hiện trong các truy vấn điển hình, do đó rất khó để phát hiện (đối với tân binh này). Đây là trên postgres 9.4.1

Một số chi tiết hơn:

Làm postgres=# SELECT * FROM test; cho:

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

nhưng cố gắng để lựa chọn chỉ là cột đầu tiên SELECT anID FROM test; dẫn đến một lỗi:

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

Chỉ cần nhìn vào các tên cột không giúp được: postgres=# \d test;

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

nhưng trong pgAdmin nếu bạn bấm vào tên cột và tìm kiếm trong cửa sổ SQL nó dân cư với:

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

và lo and behold có các quoutes xung quanh tên cột. Vì vậy, sau đó cuối cùng là postgres=# select "anID" FROM test; hoạt động tốt:

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

Cùng đạo đức, không sử dụng dấu ngoặc kép.

1

tôi cố định nó bằng cách thay đổi dấu báo giá (") với apostrophe (') bên trong giá trị Ví dụ:.

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

trở thành này:

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

Giả sử cột datetimeVarChar.

1

Chúng tôi đã gặp sự cố này khi tạo bảng bằng ứng dụng khách phppgadmin. Với phppgadmin, chúng tôi đã không chỉ định bất kỳ dấu ngoặc kép nào trong tên cột và chúng tôi vẫn gặp phải vấn đề tương tự.

Chúng tôi tạo cột với caMel case sau đó phpPGAdmin ngầm thêm dấu ngoặc kép xung quanh tên cột. Nếu bạn tạo cột với tất cả các trường hợp thấp hơn thì bạn sẽ không gặp phải vấn đề này.

Bạn có thể thay đổi cột trong phppgadmin và thay đổi tên cột thành tất cả các trường hợp thấp hơn, sự cố này sẽ biến mất.

+1

Theo câu trả lời của bạn, bạn nghĩ rằng vấn đề có thể là tên cột không phải là "foo". Sau đó bạn nên nói rõ ràng và có thể yêu cầu kết quả của câu lệnh chọn từ nơi bạn có thể thấy, cách nó được tạo ra. Chỉ để chắc chắn rằng đây là trường hợp. Nó là một thực hành tốt để cung cấp một giải pháp cho trường hợp này như được đề xuất bởi câu trả lời của bạn. Vì vậy, vui lòng chỉnh sửa câu trả lời của bạn để cung cấp giải pháp hữu ích hơn. – iOS

0

Tôi cố định vấn đề tương tự bởi qutating tên cột

SELECT * from table_name where "foo" is NULL; 

Trong trường hợp của tôi nó chỉ là

SELECT id, "foo" from table_name; 

mà không có dấu ngoặc kép I'v đã cùng một lỗi.

Các vấn đề liên quan