如果存在命令设置变量

问题描述:

我有一个工作的IF EXISTS命令来选择已经在表中的PID_GUID,或者选择一个值作为PID_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; 
+0

在'IF EXISTS',可以在'选择PID_GUID'进行重构,只是'选择1'?如果一行被返回,'IF EXISTS'不会检查'PID_GUID'是否为NULL,对吗? – Shawn

+0

@Shawn如果'PID_GUID'为'null',只要该行存在就没关系 – SqlZim

+0

谢谢,这就是我的想法。这是一种微型优化,但我曾经与一个系统合作,在这个系统中我们可以发挥每盎司的性能。我有点认识到“IF EXISTS”。据我所知,选择一个真正的列会导致SQL引擎解析列,而1只返回一个布尔值。 – Shawn

我会使用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服务器 -

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') 
+0

我喜欢这一款。这将处理已在PID中的NULL PID_GUID。那么问题就是如果那是预期的行为。如果'PID'中已经有'NULL',Gordon的查询将会使'@OLDPID = NULL'。但是如果一个'NULL'是一个有效的响应,这将覆盖它。但是,“COALESCE()”非常棒。 :-) – Shawn

+0

即时获取语法错误? – user3463443

+0

@ user3463443对于SQL 2008,只需使用'SELECT TOP 1 PID_GUID'并放下'FETCH FIRST 1 ROW ONLY'。我认为这就是DB2。 MS SQL有一个FETCH,但它需要与OFFSET(光标外)一起使用,并且只能在2012+以上使用。 – Shawn