Câu lệnh IF-THEN-ELSE trong postgresql


83

Tôi đang tìm cách viết một truy vấn postgresql để thực hiện những việc sau:

if(field1 > 0,  field2 / field1 , 0)

Tôi đã thử truy vấn này, nhưng nó không hoạt động

if (field1 > 0)
then return field2 / field1 as field3
else return 0 as field3

cảm ơn


nhìn vào "biểu thức có điều kiện" (CASE) postgresql.org/docs/current/static/functions-conditional.html
Paolo Falabella

Câu trả lời:


144

Như đã nêu trong tài liệu PostgreSQL ở đây :

Biểu thức SQL CASE là một biểu thức điều kiện chung, tương tự như các câu lệnh if / else trong các ngôn ngữ lập trình khác.

Đoạn mã trả lời cụ thể câu hỏi của bạn:

SELECT field1, field2,
  CASE
    WHEN field1>0 THEN field2/field1
    ELSE 0
  END 
  AS field3
FROM test

7
Vì tò mò, không có giải pháp nào sử dụng câu lệnh if-then-else? Câu hỏi yêu cầu một if-then-else nhưng câu trả lời là một câu lệnh switch-case.
Abel Callejo 19/12/16

Xin chào Abel, câu hỏi yêu cầu giải pháp cho một vấn đề cụ thể. Câu trả lời giải quyết vấn đề cụ thể đó. Trong các SELECTcâu lệnh, các điều kiện bạn có thể sử dụng, trong đó có một điều kiện CASE, được ghi lại ở đây .
Joseph Victor Zammit

Trong trường hợp đó, sẽ rõ ràng hơn nếu bạn thêm vào câu trả lời lý do tại sao khó hơn hoặc tại sao bạn không thể đạt được điều này bằng cách sử dụng câu lệnh if-then.
Maximiliano Becerra

2
@MaximilianoBecerra Đã xong. Xin vui lòng xem qua. Cảm ơn đề nghị của bạn.
Joseph Victor Zammit,

Các AShướng dẫn là không cần thiết. Bạn có thể làm điều nàyEND field3
Pablo Vilas


1

Nói chung, một giải pháp thay thế case when ...coalesce(nullif(x,bad_value),y)(không thể được sử dụng trong trường hợp của OP). Ví dụ,

select coalesce(nullif(y,''),x), coalesce(nullif(x,''),y), *
from (     (select 'abc' as x, '' as y)
 union all (select 'def' as x, 'ghi' as y)
 union all (select '' as x, 'jkl' as y)
 union all (select null as x, 'mno' as y)
 union all (select 'pqr' as x, null as y)
) q

cho:

 coalesce | coalesce |  x  |  y  
----------+----------+-----+-----
 abc      | abc      | abc | 
 ghi      | def      | def | ghi
 jkl      | jkl      |     | jkl
 mno      | mno      |     | mno
 pqr      | pqr      | pqr | 
(5 rows)

đôi khi tôi không muốn cuộc thi case whenvà điều này phù hợp với hóa đơn
StephenBoesch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.