2017-03-21 3 views
0

Ich habe die folgende Ansicht:die Berechnung von CASE in der Folge in PostgreSQL verwenden

CREATE OR REPLACE VIEW view_a AS 
SELECT distinct p.partid, case when 
       (SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) 
       FROM age(NOW(), LEAST(pp.createdate)) AS t(age)) AS months_between 

       <24 then months_between::integer else 24 end as timeframe 
    FROM .... 
    WHERE ....; 

Diese Ansicht seit diesem Datum createdate (Zeitstempel des ältesten urkundlich erwähnten Erstellungsdatums pro partid) und berechnet die Monate vergangen nimmt zu NOW() gleiche wie here wenn das Ergebnis kleiner als 24 (Monate) getan, was ich will dieses Ergebnis sonst will ich 24.

Diese arbeiten derzeit nicht den AS months_between in der Mitte des Gehäuses nicht akzeptiert.

Wie kann ich das tun?

EDIT:

Zum Beispiel dieser Abfrage funktioniert:

SELECT distinct p.partid, case when 
       (SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) 
       FROM age(NOW(), LEAST(pp.createdate)) AS t(age)) 
       <24 then 5 else 24 end as timeframe 
    FROM .... 
    WHERE ....; 

aber es wird wieder 5 oder 24 und es ist nicht das, was ich will. Ich möchte, dass es den im CASE berechneten Wert zurückgibt.

die Frage vereinfachen im Grunde die Form ist:

case when calculated_value < 24 then calculated_value else 24 end; 

Ich mag die calculated_value im Fall zurückkehren können.

+0

Kannst du LEAST hier nicht verwenden? siehe https://www.postgresql.org/docs/8.1/static/functions-conditional.html#AEN12704 –

+0

@RC. Am wenigsten ist das Problem. Siehe die Änderung. – avi

+0

Dann kopieren Sie einfach diese Berechnung zu Ihrem THEN ... ELSE –

Antwort

1

Sie könnten versuchen, MONTHS_BETWEEN Berechnung bewegen zum common table expression (MIT Abfrage), so etwas wie folgt aus:

WITH timeframe_table AS (
    SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) 
    FROM age(NOW(), LEAST(pp.createdate)) AS months_between 
) SELECT 
    CASE when months_between< 24 then months_between else 24 as timeframe 
     FROM ..., timeframe_table 
     WHERE... 

Sie müssen möglicherweise einige ID-Feld hinzufügen, um timeframe_table mit Ihrem Tisch einige Joinbedingung haben .

+0

Können Sie weitere Informationen zu Ihrer Anfrage und zu den "wo" -Bedingungen bereitstellen? –

+0

Sie könnten noch 'DISTINCT' hinzufügen, Sie könnten Ihre' WHERE' Bedingungen innerhalb der WITH-Klausel verschieben. Ich benötige jedoch mehr Details, um das Problem zu lösen, mit dem Sie nicht weiter kommen. –

Verwandte Themen