2017-02-04 13 views
0

現在、次のステートメントを使用しています。 1つのステートメントでこのロジックをどのように達成できますか?SQL Server - SELECT CASE WHENを使用してビット変数を設定しますが、SELECTがレコードを返さない場合はデフォルトで0に設定します。

DECLARE @DisableCSDSync BIT 

SET @DisableCSDSync = (SELECT 
          CASE WHEN PropertyValue = 'true' 
           THEN 1 
           ELSE 0 
          END 
         FROM MyTable WITH (NOLOCK) 
         WHERE Property = 'DisableSync' AND ParentId = 61040) 

IF @DisableCSDSync IS NULL 
    SET @DisableCSDSync = 0 
+0

「PropertyValue」のデータ型は? –

答えて

1

変数を宣言するときにデフォルト値を設定することができます。これにより、選択クエリで行がフェッチされない場合に変数がデフォルト値になります。また、このようにフェッチする行がない場合はnullに行くから値を防ぐために、SELECT文で値を設定します。

DECLARE @DisableCSDSync BIT = 0 

SELECT @DisableCSDSync = CASE WHEN PropertyValue = 'true' THEN 1 ELSE 0 END FROM MyTable WITH (NOLOCK) WHERE Property = 'DisableSync' AND ParentId = 61040 
+0

私は答えが好きですが、これは 'COALESCE'でもできますか? – Brad

1

このクエリは、select返さないレコードの

場合でも出力を期待与えます
DECLARE @DisableCSDSync BIT 

SET @DisableCSDSync = ISNULL((SELECT CASE 
             WHEN PropertyValue = 'true' THEN 1 
             ELSE 0 
            END 
           FROM MyTable WITH (NOLOCK) 
           WHERE Property = 'DisableSync' 
            AND ParentId = 61040), 0) 
0

あなたはまた、それがゼロ行のケースに対処するために他の回答の一つとして同じISNULLアプローチを使用していますが、また同じを使用して、次の

DECLARE @DisableCSDSync BIT = ISNULL(TRY_CAST((
        SELECT PropertyValue 
        FROM MyTable WITH (NOLOCK) 
        WHERE Property = 'DisableSync' 
          AND ParentId = 61040) AS BIT), 0); 

を使用することができます(TRY_CAST .. AS BITと一緒に)ISNULLをのCASEの支店で処理します。

意味はありません正確PropertyValueが、それは上記のアプローチでtrueとして扱われます1ですが、おそらく、彼らは十分に接近している場合には同じ。

0

DECLARE @DisableCSDSync BIT

セット@DisableCSDSync = ISNULL( (MyTableというWITH(NOLOCK) プロパティ= 'DisableSync' からMAX(CASE WHEN PropertyValueをは= '真' THEN 1 ELSE 0 END) を選択 AND ParentId = 61040) 、0)

レコードを受け取らない場合、Isnullはデフォルト値0を与えます。 最大値は1レコードしか受け取らないことを確認します。複数のレコードでエラーが発生します。

関連する問題