2017-11-12 14 views
0

一括挿入(PostgreSQLの)

私はテーブルにこのクエリの結果を挿入する「日」:

WITH days AS ( 
SELECT 
date_part('dow',generate_series('2017-11-01','2017-11-30', interval '1 day')) as dow, 
to_char(generate_series('2017-11-01','2017-11-30', interval '1 day'),'YYYY-MM-DD') as date) 

SELECT 0 as id,date, 
CASE 
WHEN dow=1 then 8 
WHEN dow=2 then 8 
WHEN dow=3 then 8 
WHEN dow=4 then 8 
WHEN dow=5 then 8 
WHEN dow=6 then 0 
WHEN dow=0 then 0 
ELSE 0 END as wtime 
FROM days 

テーブルそれは次のようになります。私の夢で

CREATE TABLE days 
    (id serial, dates date, wtime numeric(8,2)); 

:こののと同じくらい簡単です

INSERT * INTO days FROM (

WITH days AS ( 
SELECT 
date_part('dow',generate_series('2017-11-01','2017-11-30', interval '1 day')) as dow, 
to_char(generate_series('2017-11-01','2017-11-30', interval '1 day'),'YYYY-MM-DD') as date) 

SELECT 0 as id,date, 
CASE 
WHEN dow=1 then 8 
WHEN dow=2 then 8 
WHEN dow=3 then 8 
WHEN dow=4 then 8 
WHEN dow=5 then 8 
WHEN dow=6 then 0 
WHEN dow=0 then 0 
ELSE 0 END as wtime 
FROM days) 

これは可能ですか?どうやって?

http://sqlfiddle.com/#!15/91c720/8

答えて

3

CTE(WITH)の挿入、その後、最初に来る必要があります。また、あなたのクエリがdate列ではなく、本当のDATEタイプにvarchar型の値を生成してあなたはしかし、問題を取得しますそれ以外の場合は名前days

with gen_days (
...) 
insert into days 
select * 
from gen_days; 

不明瞭になり、CTEに別の名前を付ける必要があります。 generate_series()の結果を日付にキャストするには、それを変更する必要があります。また、2つだけの単一generate_series()をする必要はありません。

WITH gen_dates AS ( 
SELECT date_part('dow',d.dt) as dow, 
     dt::date as date 
    from generate_series('2017-11-01','2017-11-30', interval '1 day') as d(dt) 
) 
insert into days (dates, wtime) 
SELECT date, 
     CASE 
     WHEN dow=1 then 8 
     WHEN dow=2 then 8 
     WHEN dow=3 then 8 
     WHEN dow=4 then 8 
     WHEN dow=5 then 8 
     WHEN dow=6 then 0 
     WHEN dow=0 then 0 
     ELSE 0 
     END as wtime 
FROM gen_dates 

無関係が、

:あなたは本当にCTEを必要としません。

insert into days (dates, wtime) 
SELECT dt::date, 
     CASE date_part('dow', dt) 
     WHEN 1 then 8 
     WHEN 2 then 8 
     WHEN 3 then 8 
     WHEN 4 then 8 
     WHEN 5 then 8 
     WHEN 6 then 0 
     WHEN 0 then 0 
     ELSE 0 
     END as wtime 
FROM generate_series('2017-11-01','2017-11-30', interval '1 day') as d(dt); 

注意あなたがに対してテスト表現を繰り返す必要はありませんCASE文の短い形式:あなたはに挿入を簡素化することができます。

+0

作品: もう一つの問題は、あなたの「日付」ソース列は、実際のdateデータ型ではないということでした。他のすべての余分なものは高く評価されます。ありがとうございました! – sibert

0

CTEとターゲットテーブルの名前が同じである可能性があります。予想されるような

INSERT * INTO days 
WITH days_cte AS ( 
SELECT 
date_part('dow',generate_series('2017-11-01','2017-11-30', interval '1      day')) as dow, 
to_char(generate_series('2017-11-01','2017-11-30', interval '1 day'),'YYYY-MM-DD') as date) 
SELECT 0 as id, "date"::date, 
CASE 
WHEN dow=1 then 8 
WHEN dow=2 then 8 
WHEN dow=3 then 8 
WHEN dow=4 then 8 
WHEN dow=5 then 8 
WHEN dow=6 then 0 
WHEN dow=0 then 0 
ELSE 0 END as wtime 
FROM days_cte