2017-12-11 2 views
1

Ich versuche, einige Verschachtelung CASE WHEN Logik für meine Postgres SQL-Abfrage zu vereinfachen. Mir wurde gesagt, COALESCE kann helfen. Aber es scheint, COALESCE ist gut für die Verwendung des nächsten Werts, der zur Verfügung gestellt wird, wenn die vorherigen NULL sind, nicht unbedingt Vergleiche.Verschmelzen mit Vergleichen

Zum Beispiel, Meine Logik ist so, dass ich Cascading Checks habe. Die Excel-Logik, die ich versuche zu replizieren sieht aus wie folgt:

=IF(W3="X", 
    IF(
     ISERROR(
      INDEX(
       'LOOKUP A'!$L:$L,MATCH($AC3,'LOOKUP A'!$J:$J,0) 
      ) 
     ), 
     'LOOKUP A'!$L$2, 
     INDEX(
      'LOOKUP A'!$L:$L,MATCH($AC3,'CSR Product City'!$J:$J,0) 
     ) 
    ), IFERROR(

     /* 
      If Not LOOKUP B 
       Then LOOKUP C 
        Then LOOKUP D 
     */ 
     INDEX(
      'LOOKUP B'!$I:$I,MATCH($Y3,'LOOKUP B'!$P:$P,0) 
     ), 
     IFERROR(
      INDEX(
       'LOOKUP C'!$H:$H,MATCH($Z3,'LOOKUP C'!$O:$O,0) 
      ), 
      IFERROR(
       INDEX(
        LOOKUP D!$G:$G,MATCH($S3,LOOKUP D!$A:$A,0) 
       ), 
       LOOKUP D!$G$2 
      ) 
     ) 
    ) 
) 

Welche als solche in SQL kommt. Ich möchte COALESCE verwenden, aber ich bin nicht sicher, wie in diesem Fall, weil ich sehe nicht, wie ich eine IF a.val == b.val THEN Logik tun:

SELECT 
    (CASE 
    WHEN a.price = b.price THEN 
     (CASE 
     WHEN a.city = b.city THEN 'match!' 
      ... 
    ) 
    ELSE 
     ... 

    END) as test 

Antwort

1

Sie gerade auf false Vergleich zu then null benötigen, zB:

t=# SELECT coalesce(
    case when 1=2 then 'match1' else null end 
, case when 2=3 then 'match2' else null end 
,case when 2=2 then 'match3' else null end 
); 
coalesce 
---------- 
match3 
(1 row)