如果不存在 SQL 语句

Posted

技术标签:

【中文标题】如果不存在 SQL 语句【英文标题】:IF NOT EXISTS SQL Statement 【发布时间】:2014-07-31 22:48:51 【问题描述】:

我对 SQL 还很陌生。我正在尝试编写一个存储过程来检查“别名”是否在表中,如果是则返回详细信息;如果它不存在,它将添加它。目前我已经完成了 50% 的工作,但如果它确实存在,它不会返回别名详细信息

DECLARE @Alias VARCHAR(MAX)

IF NOT EXISTS(SELECT * FROM [Users] where [Alias] = @Alias)
   INSERT INTO [Users] ([Alias], [Country], [Role]) 
   VALUES (@Alias, 'UK', 'User')

谁能告诉我哪里出错了?

提前致谢

汤姆

【问题讨论】:

应该返回这个值的代码在哪里? 您缺少条件的else 部分,您必须返回详细信息 您能更好地解释发生了什么问题吗? 它没有返回值。我猜马丁已经说过 - 我还没有写那部分代码。通过放置“ELSE SELECT * FROM [Users] Where [Alias]=@Alias”对我的问题进行排序? 你真的只想在它不存在的情况下返回它吗?还是应该返回该行?此外,您可能应该对此设置唯一约束,否则这不是线程安全的,您可能会被骗。 【参考方案1】:

您似乎希望别名是唯一的 - 为什么不简单地创建这样的约束:

create unique index users_alias on users(alias);

或者,如果您确实必须通过查询来完成,请使用 select-into:

INSERT INTO [Users] ([Alias], [Country], [Role])
SELECT @Alias, 'UK', 'User'
FROM (SELECT 1) DUAL
WHERE NOT EXISTS(SELECT * FROM [Users] where [Alias] = @Alias)

如果还没有具有别名的用户,则查询的 SELECT 部分返回 1 行,否则没有行。

需要考虑的事项:您不需要存储过程来执行此操作。 需要考虑的其他事项:您可能根本不需要存储过程。 需要进一步考虑:存储过程实际上可能是 bad idea

【讨论】:

这并没有回答关于返回行的问题。 这是更大的 VBA 代码的一部分,与权限设置有关。它不会创建 Alias,但会存储用户的 windows 环境登录信息,以便以后可以从 Outlook 通讯簿中查找用户详细信息。正如我所说 - 我是 SQL 新手,如果这是一种更好且更合适的方法,那么请说

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

SQL语句 存在就更新不存在就插入

用sql语句更新一条记录,如果不存在就插入,怎么写?

Mysql 存在既更新,不存在就添加(sql语句)

SQLITE检查表users是不是存在的sql语句,如果不存在则创建表users

sql server 判断记录存在更新不存在插入

如果表不存在,如何运行包含针对另一个 sql 实例上的表的查询的 If-Then-Else 语句?