2012-04-03 30 views
36

Có một sự thay thế đơn giản nào trong PostgreSQL đối với câu lệnh này được tạo ra trong Oracle không?Làm cách nào để kiểm tra xem một cột có tồn tại trong bảng hay không bằng cách sử dụng câu lệnh SQL

select table_name from user_tab_columns 
where table_name = myTable and column_name = myColumn; 

Tôi sau đó kiểm tra xem truy vấn có trả về bất kỳ điều gì để chứng minh cột tồn tại hay không.

Tôi biết rằng việc sử dụng psql tôi có thể tìm thấy chúng riêng lẻ nhưng điều này là bắt buộc để tạo kết quả trong một chương trình mà tôi đang viết để xác thực rằng trường thuộc tính được yêu cầu tồn tại trong bảng cơ sở dữ liệu của tôi.

Trả lời

75

Hãy thử điều này:

SELECT column_name 
FROM information_schema.columns 
WHERE table_name='your_table' and column_name='your_column'; 
+0

Cảm ơn. Được chấp nhận là câu trả lời vì nó là một thay thế trực tiếp cho những gì tôi đã làm trong Oracle. – CSharpened

+0

hoạt động theo cùng một cách trên MySQL, đó là tốt đẹp – Evgeny

+0

@CSharpened truy vấn cho Oracle là gì? – Evgeny

3
SELECT attname 
FROM pg_attribute 
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') 
AND attname = 'YOURCOLUMNNAME'; 

Tất nhiên, thay YOURTABLENAMEYOURCOLUMNNAME với các giá trị thích hợp. Nếu một hàng được trả về, một cột có tên đó tồn tại, nếu không nó sẽ không tồn tại.

+0

Cảm ơn bạn đã trả lời. Mặc dù ví dụ của bạn hoạt động tốt nhưng tôi đã chọn chấp nhận câu trả lời của Ramandeeps do sự đơn giản của nó và thực tế rằng nó dường như là một giải pháp thay thế trực tiếp hơn cho vấn đề của tôi. – CSharpened

13

Đây là đơn giản hơn (và SQLI-safe) với PostgreSQL của object identifier types:

SELECT TRUE 
FROM pg_attribute 
WHERE attrelid = 'myTable'::regclass -- cast to a registered class (table) 
AND attname = 'myColumn' 
AND NOT attisdropped -- exclude dropped (dead) columns 
-- AND attnum > 0  -- exclude system columns (you may or may not want this) 

Đọc về số significance of the columns in the manual.

Nếu bạn đang xây dựng SQL năng động và tên cột của bạn được cung cấp như thông số, bạn có thể muốn sử dụng quote_ident() để tránh SQL injection:

... 
AND attname = quote_ident('myColumn'); 

trình cho các bảng bên ngoài search_path, quá:

... 
WHERE attrelid = 'mySchema.myTable'::regclass 
... 
16

Câu trả lời được chấp nhận là chính xác nhưng thiếu sơ đồ và đầu ra đẹp hơn (True/False):

SELECT EXISTS (SELECT 1 
FROM information_schema.columns 
WHERE table_schema='my_schema' AND table_name='my_table' AND column_name='my_column'); 
0

Đây là một biến thể tương tự của câu trả lời của Erwin Brandstetter. Ở đây chúng ta cũng kiểm tra lược đồ trong trường hợp chúng ta có các bảng tương tự trong lược đồ khác nhau.

SELECT TRUE FROM pg_attribute 
WHERE attrelid = (
    SELECT c.oid 
    FROM pg_class c 
    JOIN pg_namespace n ON n.oid = c.relnamespace 
    WHERE 
     n.nspname = CURRENT_SCHEMA() 
     AND c.relname = 'YOURTABLENAME' 
    ) 
AND attname = 'YOURCOLUMNNAME' 
AND NOT attisdropped 
AND attnum > 0 
Các vấn đề liên quan