2010-11-16 49 views
7

Xin ông cho biết lý do tại sao tôi isnt sau làm việc trong postgres sql ?:Postgres lồng nhau nếu trong trường hợp truy vấn

See updated code below 

UPDATE:

tôi hy vọng các truy vấn để trở về "0,30" như phao. cấu trúc này chỉ dành cho mục đích thử nghiệm, tôi có một số querys phức tạp mà phụ thuộc vào cấu trúc điều kiện này ... nhưng tôi không biết làm thế nào để sửa chữa nó ..

Kết quả là:

ERROR: syntax error at or near "1" 
LINE 4:  if 1=1 then 

UPDATE:

xây dựng này xuất hiện trong một hàm ... vì vậy tôi muốn làm sau:

CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$ 
    BEGIN 
    select (
     case (select '1') 
     when '1' then 
     if 1=1 then 
      0.30::float 
     else 
      0.50::float 
     end 
     else 
     1.00::float 
     end 
    ); 
    END; 
$$ LANGUAGE plpgsql; 

select f_test(1) as test; 

thông báo lỗi xem ở trên.

+0

sử dụng ngôn ngữ thích hợp, không cần sử dụng bất kỳ thứ gì ngoài pg tại đây. – Woot4Moo

+0

xác định "isnt working". Bạn đã mong đợi điều gì sẽ xảy ra và điều gì đã xảy ra. – Hamish

+0

Đầu ra thực tế mà bạn đang mong đợi là gì? – Woot4Moo

Trả lời

9

Không có cú pháp IF expr THEN result ELSE result END cho truy vấn SQL bình thường trong Postgres. Như có không phải là một chức năng IF() như trong MySQL, bạn phải sử dụng CASE:

select (
    case (select '1') 
    when '1' then 
    case when 1=1 then 0.30::float else 0.50::float end 
    else 
    1.00::float 
    end 
); 
+0

Có, hãy xem http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html – Lichtamberg

+0

Không, không, đó là các thủ tục được lưu trữ. Đối với họ cũng có một trong MySQL, nhưng * không * cho SQL bình thường. – AndreKR

+0

Ive cập nhật bài viết của tôi, tôi sử dụng mã này trong một chức năng ... vì vậy nó sẽ làm việc? – Lichtamberg

1

Tôi không biết những gì bạn đang cố gắng để đạt được với chức năng này, nhưng đây là một phiên bản làm việc.

CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$ 
BEGIN 
    IF myvalue = 1 THEN 
      IF 1=1 THEN 
        RETURN 0.30::FLOAT; 
      ELSE 
        RETURN 0.50::FLOAT; 
      END IF; 
    ELSE 
      RETURN 1.0::FLOAT; 
    END IF; 
END; 

Hàm này trả về 0.3 nếu giá trị đầu vào là 1, ngược lại sẽ trả về 1. Edit: Lưu ý rằng 0,5 là không bao giờ được trả về bởi hàm.

+0

Nó chỉ là một chức năng thử nghiệm mà không có ý nghĩa .. Nhưng tôi có các truy vấn phức tạp mà phụ thuộc vào cấu trúc điều kiện này .. Tôi sẽ cố gắng trả lời của bạn ... THanks – Lichtamberg

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