2017-09-15 5 views
4

IF EXISTSコマンドを使用して、すでにテーブルにあるPID_GUIDを選択するか、またはテーブルに存在しない場合はPID_GUIDとして使用する値を選択します。コマンドは次のようになります。Existsコマンドで変数を設定する場合

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'がNULLかどうかをチェックしません。 – Shawn

+0

@Shawn 'PID_GUID'が' null'であるかどうかは関係ありません。その行が存在する場合のみ – SqlZim

+0

ありがとう、それは私が思ったことです。これはマイクロ・オプティマイゼーションのようなものですが、私たちはできる限りの性能を発揮するシステムを使用していました。私は「存在する」ということを幾分認識しました。私の知る限り、aを選択すると実際の列が選択され、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 Serverの - ? `EXISTS`場合は、` SELECT PID_GUID`がちょうど '1' SELECTをリファクタリングすることができて

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

私はこの1つが好きです。これはすでにPIDにあるNULL PID_GUIDを処理します。それが意図された行動であるかどうかという疑問があります。 Gordonのクエリは、 'PID'にすでに' NULL'だった場合は '@OLDPID = NULL'を返します。しかし、もし 'NULL'が有効な応答であれば、これはそれを上書きします。しかし、はい、 'COALESCE()'はかなり素晴らしいです。 :-) – Shawn

+0

fetchで構文エラーが発生しましたか? – user3463443

+0

@ user3463443 SQL 2008の場合、 'SELECT TOP 1 PID_GUID'を使い、' FETCH FIRST 1 ROW ONLY'をドロップしてください。私はそれがDB2だと思う。 MS SQLにはFETCHがありますが、OFFSET(カーソルの外側)で使用する必要があります。これは2012+でのみ動作します。 – Shawn

関連する問題