PostgreSQL插入大小写

时间:2019-05-11 14:35:32

标签: postgresql

我要在dining_table_grouping表中存储以下列:

  • layout_id
  • dining_table_id
  • master_dining_table_id
  • start_timestamp
  • end_timestamp
通过insert语句为每个列提供

值。

我要对此insert语句应用条件。

因此,如果我要存储列的值

  • start_timestamp
  • end_timestamp
  • layout_id

这些列中已经存在我想进一步检查是否要存储在列中的值

  • dining_table_id
  • master_dining_table_id
这些列中已经存在

。但是,这两列中的任何一个都不应该存在这些值。

如果同时满足两个条件,则不应存储这些值。 如果满足第一个条件,不满足第二个条件,则存储值。 如果不满足第一个条件,但满足第二个条件,则存储值。 (无需检查第二个条件) 如果不满足任何条件,请存储这些值。

示例:

表中的值:

1, 2, 3, 2019-03-13 08:00:00, 2019-03-13 09:00:00

我要插入的值:

5, 4, 6, 2019-03-13 07:00:00, 2019-03-13 10:00:00

结果:

不满足第一个条件。 值将被存储。

我要插入的值:

5, 4, 2, 2019-03-13 07:00:00, 2019-03-13 10:00:00

结果:

不满足第一个条件。 值将被存储。

我要插入的值:

5, 4, 2, 2019-03-13 08:00:00, 2019-03-13 10:00:00

结果:

满足第一个条件。 第二个也。 值将不会存储。

我该如何实现?

一个类似的问题:

Postgres CASE Statement in an insert

我认为我的尝试只会使您感到困惑,但仍然是这样:

INSERT INTO dining_table_grouping 
 
            ( 
                        id, 
                        
 layout_id, 
                        
 dining_table_id, 
                        
 master_dining_table_id, 
                        
 start_timestamp, 
                        
 end_timestamp 
 
            ) 
            
 
SELECT $1, 
       
 $2, 
       
 $3, 
       
 $4, 
       
 $5, 
       
 case
 WHEN ( 
              layout_id <> $1 
       AND    start_timestamp <> $4 
       AND    end_timestamp <> $5) 
AND    ( 
              dining_table_id <> ($2, $3) 
       AND    master_dining_table_id <> ($2, $3)) end
 
FROM   dining_table_grouping;

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这可能是您要问的:

insert into dining_table_grouping (layout_id, dining_table_id, master_dining_table_id, start_timestamp, end_timestamp)
select $1, $2, $3, $4, $5
where not exists (
select * from dining_table_grouping where layout_id = $1 and start_timestamp = $4 and start_timestamp = $5 and (dining_table_id = $2 or dining_table_id = $3 or master_dining_table_id = $2 or master_dining_table_id = $3)
);