如果结果不存在,则 MS SQL 插入

Posted

技术标签:

【中文标题】如果结果不存在,则 MS SQL 插入【英文标题】:MS SQL insert if not exist with a result 【发布时间】:2014-02-06 08:18:16 【问题描述】:

我想使用像 .ini 文件这样的 SQL 表

所以:

 select answer from x where (y=z)  
 if exists 
  
   return answer (from databse)
  
else
    
   insert into x, (answer) where (y=z)  
   return answer (from default)
 

其中 answer 是默认值,可能会被查询更改。

如果可能的话,我想在一个查询中执行此操作,我可以分两个执行此操作,但我确信还有一种更优雅的方法。

【问题讨论】:

您可以在临时表中使用 OUTPUT 子句并从该临时表中进行选择。查看关于 OUTPUT 子句的 MSDN 文章。 为什么要插入?如果它不存在,为什么不继续获得默认值?如果您以静默方式插入,行为会如何变化,而不是以一种不好的方式,您无法更改默认值。我觉得你的想法很糟糕。插入应该是手动和仔细考虑的,而不是魔术 因为我的用户可能希望默认值为 30 或 70,或者“苹果”调整默认值的代码在别处。我的用户可能会决定他们想要测量多个值。我不知道,我在这里,他们在未来。 ini 文件很神奇,完全以这种方式工作,只需在记事本中打开它们,你就会咯咯地笑,但我不知道(我过去记得)我是否可以访问未来的用户文件系统。不知道波西米亚人的答案并不羞耻 【参考方案1】:

假设表 c 具有当前配置的值,表 d 包含系统默认值

都带有字段 key(唯一约束)和 val

我可以使用联合查询来查找值

select top 1 * from ( 
  select 'c' source, key, val from c
  union all 
  select 'd', key, val from d
) x
where key = 'something'
order by source

如果存在则返回配置值,不存在则返回默认值。我有点同意@bohemian - 不确定我是否看到插入点,如果更改默认值,那么查询仍然有效。

如果你真的想做插入,可以考虑推出一个存储过程。

【讨论】:

【参考方案2】:

不确定,为什么您将 DML 与 @Bohemian 提到的选择混合在一起 但在选择部分你可以做类似下面的事情

select
case 
when exists(select answer from x where y=z) then answer
else (select answer from default) as answer
end

【讨论】:

以上是关于如果结果不存在,则 MS SQL 插入的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select:如果存在则更新,如果不存在则插入 - 使用日期部分比较?

如果不存在则插入数据的过程pl sql

SQL 查询 - 如果存在则更新,否则插入

如果不存在则插入 Spark SQL 中的其他更新

MS SQL 2008/Access 2002 VBA - 检查数据库的当前记录,如果不存在则输入

Postgres:如果不存在则插入