Sql 设置变量中的If Exists命令
我有一个有效的IF EXISTS命令来选择表中已经存在的PID\u GUID,或者选择一个值作为PID\u GUID(如果表中还不存在)。命令如下所示Sql 设置变量中的If Exists命令,sql,sql-server,variables,if-statement,exists,Sql,Sql Server,Variables,If Statement,Exists,我有一个有效的IF EXISTS命令来选择表中已经存在的PID\u GUID,或者选择一个值作为PID\u GUID(如果表中还不存在)。命令如下所示 IF EXISTS (SELECT PID_GUID FROM PID WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595') BEGIN SELECT PID_GUID FROM PID WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR P
IF EXISTS (SELECT PID_GUID FROM PID WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595')
BEGIN
SELECT PID_GUID FROM PID WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595'
End
ELSE
SELECT 'a70600f4-1cff-4284-a2ce-5eb19f47cf19'
现在我想做的是把它放到设置一个变量中,比如:
Daclare @OLDPID = VARCHAR(36)
SET @OLDPID = IF EXISTS (SELECT PID_GUID FROM PID WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595')
BEGIN
SELECT PID_GUID FROM PID WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595'
End
ELSE
SELECT 'a70600f4-1cff-4284-a2ce-5eb19f47cf19'
在SQL2008中如何执行此操作?在每个语句中设置变量:
IF EXISTS (SELECT PID_GUID FROM PID WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595')
BEGIN
SELECT @OLDPID = PID_GUID
FROM PID
WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595'
End
ELSE
SELECT @OLDPID = 'a70600f4-1cff-4284-a2ce-5eb19f47cf19';
实际上,我更倾向于使用:
DECLARE @OLDPID VARCHAR(36) = 'a70600f4-1cff-4284-a2ce-5eb19f47cf19';
IF EXISTS (SELECT PID_GUID
FROM PID
WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595'
)
BEGIN
SELECT @OLDPID = PID_GUID
FROM PID
WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595';
END;
我会使用COALESCE()
,因为COALESCE()
可以做任何事情
SELECT @OLDPID = COALESCE((SELECT PID_GUID
FROM PID WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595'
FETCH FIRST 1 ROW ONLY),
'a70600f4-1cff-4284-a2ce-5eb19f47cf19')
我们不需要臭IF语句
SQL Server--
我喜欢这个。这将处理PID中已存在的空PID\u GUID。接下来的问题是,这是否是预期的行为。Gordon的查询将使
@OLDPID=NULL
如果它在PID
中已经是NULL
。但是如果NULL
是有效的响应,则会覆盖它。但是是的,COALESCE()
非常棒。:-)@用户3463443对于SQL 2008,只需使用选择前1个PID\u GUID
并删除仅获取前1行。我想这就是DB2。MS SQL有一个FETCH,但它需要与偏移量一起使用(在游标之外),这只适用于2012+。@user3463443——是的,如果您使用的是SQL Server,则使用TOP 1
语法,正如Shawn所建议的那样,您实际上可以完全消除存在的问题。只需将变量设置为默认值,然后使用select语句填充查询即可。如果未返回任何行,则该值仍将是默认值。:)@Shawn我习惯性地使用选择1
。exists()
和notexists()
都不返回行,因此可以使用selectnull
或select1
。基于本文,使用select1
将避免在查询编译期间检查该表的任何不需要的元数据。运行的测试显示实际性能没有差异。@SeanLange我知道你没有阅读我评论的后半部分。-Martin Smith的回答在第二个链接中详细介绍了所有这些。此外,查询的编译不同于查询的执行。@SqlZim是的,我在阅读第二篇文章之前发表了我的评论,这篇文章反驳了第一篇文章的作者所说的话。:)@SqlZim对不起,“返回行”对我来说有点过于简单了。我的意思是,IF EXISTS
只检查是否存在记录。我刚刚尝试了选择1/0
:非常有趣。谢谢,肖恩。这是一种“确认你不知道你不知道的事情”。我会说,在阅读了Zim的两个链接之后,我倾向于信任那些在编译器上工作的人,但只信任他们所工作的版本。第二篇文章显示,它在2011/14年的工作方式与2008年的工作方式不同。
SELECT @OLDPID = COALESCE((SELECT TOP 1 PID_GUID
FROM PID WHERE EDI_ID = '12874' OR PID = 'ROBERT' OR PID = 'R595'),
'a70600f4-1cff-4284-a2ce-5eb19f47cf19')