2013-07-01 13 views
18
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'X' AND COLUMN_NAME = 'Y') 

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Z' AND COLUMN_NAME = 'A') 
BEGIN 
    UPDATE [dbo].[X] 
     SET Y= (SELECT inst.[A] FROM [dbo].[Z] s WHERE s.[B] = [dbo].[x].[B]); 
END  
    GO 

私は2つのIFコンフィグレーションを組み合わせて、両方が満たされている場合にのみアップデートを実行したいと考えています。私はクラブ2が存在するいくつかの方法がありますか?IF EXISTSでSQLでAND条件を使用するにはどうすればよいですか?

答えて

35

シンプル:* SELECTを実行して、すべての列を選択する

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'X' AND COLUMN_NAME = 'Y') 
AND EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Z' AND COLUMN_NAME = 'A') 

BEGIN 
    UPDATE [dbo].[X] 
     SET Y= (SELECT inst.[A] FROM [dbo].[Z] s WHERE s.[B] = [dbo].[x].[B]); 
END  
GO 
+0

それとも、実際にあなたのコードを見て、空、それが書かれたように動作します - 第二IFは、第一の下にネストされています。ただ単にタブを追加してください:) –

+2

また、INFORMATION_SCHEMA.COLUMNSクエリにTABLE_SCHEMAを含める必要があります。そうしないと、同じテーブル名が別のスキーマに存在する場合に間違った結果が得られます。 –

+0

G、列Aまたは列Yが存在しないか、削除された場合はどうなりますか?その場合、私はエラーになります。 msg 207、レベル16、状態1、行5 無効な列名 'A'です。 – user811433

6

必要はありません。行の存在をチェックしているので、クエリを高速にするためにSELECT 1を実行してください。

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
       WHERE TABLE_NAME = 'X' AND COLUMN_NAME = 'Y') 

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = 'Z' AND COLUMN_NAME = 'A') 

    BEGIN 
     UPDATE [dbo].[X] 
      SET Y= (SELECT inst.[A] FROM [dbo].[Z] s WHERE s.[B] = [dbo].[x].[B]); 
    END  
     GO 
+0

何らかの形で「TABLE_NAME」が同時に「X」と「Z」の両方になれない限り、あなたはあなたの質問からレコードを得ることはありません。 「COLUMN_NAME」について繰り返す。また、*行の存在をチェックしているので、クエリを高速にするためにSELECT 1を実行してください。* SQL Serverはこれよりスマートです。 –

+0

はい.....それを得ました、そしてORに置き換えるべきですか? –

+0

いいえ、 'UPDATE'は' X.Y'または 'Z.A'のいずれかが存在する場合にのみ実行され、両方が存在しない場合には実行されます。 –

0

変更タイトルと説明

UPDATE `li_categories` 
    SET description = CASE 
    WHEN description = '' THEN CONCAT('optional text ', title, ' optional text') 
    ELSE description 
    END 
WHERE 
id 
関連する問題