2017-09-15 104 views
4

我有一個工作的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?

回答

2

設置在每個語句中的變量:

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

1

我會使用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

相關問題