2009-06-12 13 views
3

テーブル内の単一の行には、整数値> = 1の列がありますが、列が何回も選択されていなければなりません。したがって、列に '2'がある場合は、selectクエリで単一行を2回返すようにしたいと思います。PostgreSQL:単列xの量を選択してください

これはどのように達成できますか?

+0

あなたがそのようなことをしたいと思う理由を知っているが、...しないでくださいは、適切に複製されたか、それは常に1行のみであるべきであるテーブル内の複数の行がありますか? –

+4

また、このアプローチを使用している理由についてもお知らせください。よりクリーンなソリューションがあるかもしれません。 –

+0

これは非常に奇妙な要件です。このフォーマットが必要な従来のアプリを扱っていますか?しかし、select文の制御が渡されている場合、代わりにアプリケーションコードでループを使用することはできませんか? – MkV

答えて

1

再帰的なクエリで実行するには、 the postgresql docsの例を参照してください。

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

、あなたが1から始まる、必要な数の数字を移入:あなたはこのような数字のちょうどいっぱいあるテーブルを作ることができ

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

8.4のみ、まだベータ版です。 – rfusca

3

よう

何か:

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

次に、 "repeat_c"という列に基づいて繰り返す "mydata"テーブルがある場合あなたがそうするようにそれを照会するでしょう:

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

もちろん、最大反復カウントを知り、数字テーブルを高くする必要があります。

なぜあなたはこの考えをしたいのか分かりません。ケアを共有する?

+0

誰かがこれを読んでいたら、なぜか分かち合いましょう。議論したくないだけでなく、自分の啓発のために好奇心が強い。 – Evan

13

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

例として、整数列がカテゴリごとのサンプル数を定義するランダムサンプルを生成するためにこれを正確に必要とします。 – hfs

関連する問題