Sql 设置变量中的If Exists命令

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命令来选择表中已经存在的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 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')