2009-06-12 18 views
3

Eine einzelne Zeile in einer Tabelle hat eine Spalte mit einer Ganzzahlwert> = 1 und muss ausgewählt werden, wie oft die Spalte sagt. Wenn also die Spalte "2" hätte, möchte ich, dass die Select-Abfrage die Einzelzeile zweimal zurückgibt.PostgreSQL: Wählen Sie eine einzelne Zeile x Anzahl der Male

Wie kann dies erreicht werden?

+0

Wird es mehr Zeilen in der Tabelle, die in geeigneter Weise repliziert werden soll, oder ist es immer nur die eine Zeile? –

+4

Können Sie uns auch einen Hinweis geben, warum Sie diesen Ansatz verwenden? Es könnte eine sauberere Lösung geben. –

+0

Das ist eine sehr seltsame Anforderung, haben Sie es mit einer Legacy-App zu tun, die dieses Format benötigt? Wenn Sie jedoch die Kontrolle über die übergebene SELECT-Anweisung haben, können Sie nicht einfach eine Schleife in Ihrem Anwendungscode verwenden? – MkV

Antwort

1

Sie können es mit einer rekursiven Abfrage tun, überprüfen Sie die Beispiele in the postgresql docs.

so etwas wie

WITH RECURSIVE t(cnt, id, field2, field3) AS (
     SELECT 1, id, field2, field3 
     FROM foo 
     UNION ALL 
     SELECT t.cnt+1, t.id, t.field2, t.field3 
     FROM t, foo f 
     WHERE t.id = f.id and t.cnt < f.repeat_cnt 
) 
SELECT id, field2, field3 FROM t; 
+0

Nur in 8.4 das ist nur Beta noch. – rfusca

3

Sie einen Tisch machen könnte, die nur voll von Zahlen ist, wie folgt aus:

CREATE TABLE numbers 
(
    num INT NOT NULL 
, CONSTRAINT numbers_pk PRIMARY KEY (num) 
); 

und es mit so vielen Zahlen füllen, wie Sie benötigen, von einem Start:

INSERT INTO numbers VALUES(1); 
INSERT INTO numbers VALUES(2); 
INSERT INTO numbers VALUES(3); 
... 

Dann, wenn Sie die Tabelle „mydata“ haben, dass han auf der Spalte „repeat_c zu wiederholen, basierend ount“würden Sie es wie so abfragen:

SELECT mydata.* 
FROM mydata 
JOIN numbers 
ON numbers.num <= mydata.repeat_count 
WHERE ... 

Wenn Sie natürlich die maximale Wiederholung wissen müssen vorne zählen, und haben Ihre Zahlen Tisch hoch gehen.

Keine Ahnung, warum Sie diesen Gedanken machen möchten. Möchten Sie teilen?

+0

Wenn wer der Down-Voter das liest, sich darum kümmern, warum? Nicht streiten wollen, nur neugierig auf meine eigene Erbauung. – Evan

13

Sie wissen nicht, warum du so etwas tun wollen würde, aber ...

CREATE TABLE testy (a int,b text); 
INSERT INTO testy VALUES (3,'test'); 
SELECT testy.*,generate_series(1,a) from testy; --returns 3 rows 
+0

Als Beispiel benötige ich genau dies für die Generierung von Stichproben, wobei die Integer-Spalte die Anzahl der Stichproben pro Kategorie definiert. – hfs

Verwandte Themen