2017-06-10 1 views
1

Union explodiert wegen der JSON-Spalte, und anscheinend sind temporäre Tabellen in PostgreSQL-Funktionen fast nutzlos.Wie kann ich zwei Auswahlmöglichkeiten in der PostgreSQL-Funktion kombinieren?

Ich komme aus der MS SQL Server Welt, und es scheint, dass alles, was ich in PostgreSQL versuche, falsch ist. Das ist es was ich versuche zu tun. Kann mir bitte jemand sagen, wie es am besten geht? Oder irgendeinen Weg, dies zu tun?

Ich habe viele verschiedene Dinge ausprobiert und auf jeden Fall bekomme ich einen Fehler. Dieser spezielle Versuch gibt das zurück.

ERROR: type "output_stories" does not exist 
********** Error ********** 

ERROR: type "output_stories" does not exist 
SQL state: 42704 
+0

Wenn Sie schreiben "Union explodiert wegen der JSON-Spalte", ist das, was Sie laufen? https://dba.stackexchange.com/a/73522 – Barend

+0

Ich würde es vielleicht bevorzugen, dies in einer Union zu tun, ja. Aber ich konnte das Gewerkschaftsproblem nicht lösen. Wenn die Vereinigung ineffizient ist, würde ich sowieso eine andere Richtung bevorzugen. –

+0

Haben Sie "UNION ALL" probiert? – Barend

Antwort

1

Wenn ich richtig Ihren Anwendungsfall zu verstehen, wollen Sie alle gemerkt Geschichten auszuwählen und die (von ID) ersten 20 Nicht-Abonnenten Geschichten nach einiger Referenz-ID. Es sei denn, ich etwas in Frage bin mit Blick scheint es mir, dass Sie nicht eine gespeicherte Funktion überhaupt brauchen:

(
    SELECT id, title, body, pinned FROM Story 
    WHERE (id > 4 and not pinned) ORDER BY id DESC LIMIT 20 
) 
UNION ALL 
SELECT id, title, body, pinned FROM Story WHERE pinned; 

Ich habe an sqlfiddle mit einem Bündel von Tests. Als Referenz:

-- minimal example table 
CREATE TABLE story (
    id BIGINT PRIMARY KEY, 
    title VARCHAR, 
    body JSON, 
    pinned BOOLEAN 
) 

-- minimal example records 
INSERT INTO story (id, title, pinned) VALUES 
(1, 'pinned', true), 
(2, 'not pinned', false), 
(4, 'previous id', false), 
(5, 'next 1', false),  
(6, 'next 2', false),  
(7, 'next 3', true),  
(8, 'next 4', false); 

-- expectation 
-- 1 INCLUDE (pinned) 
-- 2 OMIT (before ref ID) 
-- 4 OMIT (is ref ID) 
-- 5 OMIT (after ref ID, but outside limit 2) 
-- 6 INCLUDE (after ref ID, not pinned) 
-- 7 INCLUDE (pinned, but don't duplicate!) 
-- 8 INCLUDE (after ref ID, not pinned) 

-- Query 
(
    SELECT id, title, body, pinned FROM Story 
    WHERE (id > 4 and not pinned) ORDER BY id DESC LIMIT 2 
) 
UNION ALL 
    SELECT id, title, body, pinned FROM Story WHERE pinned; 
+0

Ich glaube, das wird funktionieren. Vielen Dank! –

Verwandte Themen