2012-01-11 10 views
1

私はcase文を必要とするテーブルに2つのフィールドを持っています。2つの異なるフィールドで "case"ステートメントの中で "like"を使用する

 
Col1   Col2  Col3 
abc.txt  Y  0 
def.txt  N  0 
bbck.txt  Y  1 

Col3値は次のようにCol1Col2値に基づいています。
Y = 1およびN = 0。だから、YあるCol2内のすべての値はcol31なるもの、およびcol1値は%c.txtで終わっていないCol2Nは、Col30になります。 abc.txtの末尾が%c.txtであることから分かるように、col3の値は0になります。

これは、CASEステートメントでネストされている可能性があります。誰にどのように知っていますか?

ここに私のコード

SELECT 
    CASE Col2 
    WHEN 'Y' THEN '1' 
    WHEN 'N' THEN '0' 
    ELSE 
(CASE WHEN [Col1] LIKE '%c.txt' THEN '0' 
END) 
    END 
    AS Col3, 
* 
FROM Tabl1 

ホープだこのアイデアたぶん

+0

この質問は非常に不明で、これまでに試したことを投稿することをお勧めします。 – Standage

+0

これが役立つことを願っています。ありがとう – user970225

+0

私はその多くの時間を試みました。私はログインしていますが、私が数回リフレッシュすると、私がログインしたとしても、私はもう答えを選ぶことができません。 – user970225

答えて

2

を与える:

SELECT 
    CASE 
     WHEN Col2 = 'N' 
     OR Col1 LIKE '%c.txt' 
      THEN '0' 
     WHEN Col2 = 'Y' 
      THEN '1' 
    END AS Col3 
    , * 
FROM Tabl1 
+0

完璧な答え。どうもありがとう。 – user970225

+0

'Col2 = 'Y' THEN '1'は' Col'に 'Y'と' N'値だけがあれば 'ELSE '1''と置き換えられます。 –

0

これは、あなたが探して何が考えられます。

SELECT * FROM Tabl1 
cross apply 
    (
     select Col3 = 
     CASE 
      WHEN Tabl1.Col2 = 'Y' then '1' 
      WHEN Tabl1.Col2 = 'Y' then '1' 
      WHEN RIGHT(Tabl1.Col1, 6) = 'c.txt' then '0' 
      END 
) as Col3 
0
SELECT 
    CASE WHEN Col2 LIKE '%c.txt' THEN '0' 
     ELSE 
     CASE 
      WHEN Col2 = 'N' THEN '0' 
      WHEN Col2 = 'Y' THEN '1' 
     END 
    END AS COL3 
FROM Tabl1 
0

あなたの仕様が十分明確ではないと思います。次の句がに適用され、前の節がであることを明示する "無条件"という単語の前のカンマですか? 4つの可能な組み合わせがあるようです

1) Col1 LIKE '%c.txt' 
    AND Col2 = 'Y' 

2) Col1 LIKE '%c.txt' 
    AND Col2 = 'N' 

3) Col1 NOT LIKE '%c.txt' 
    AND Col2 = 'Y' 

4) Col1 NOT LIKE '%c.txt' 
    AND Col2 = 'N' 

私はcase文

は本当これは必要

言いますか? SQLの場合、同じことは常に複数の方法で達成できます(これは良いオプティマイザを構築するのが難しい理由です:)仕様があると思います何がであり、不当な制限を置かないでくださいhow

次のではなくケースよりもUNIONを使用して、最初からこれを検討していたならば、多分あなたのスペックが良いでしょう。)

WITH Tabl1 
    AS 
    (
     SELECT * 
     FROM (
       VALUES ('abc.txt', 'Y'), 
        ('def.txt', 'N'), 
        ('bbck.txt', 'Y'), 
        ('disc.txt', 'N') 
      ) AS T (Col1, Col2) 
    ) 
SELECT '0' AS Col3, * 
    FROM Tabl1 
WHERE Col1 LIKE '%c.txt' 
     AND Col2 = 'Y' 
UNION 
SELECT '0' AS Col3, * 
    FROM Tabl1 
WHERE Col1 LIKE '%c.txt' 
     AND Col2 = 'N' 
UNION 
SELECT '1' AS Col3, * 
    FROM Tabl1 
WHERE Col1 NOT LIKE '%c.txt' 
     AND Col2 = 'Y' 
UNION 
SELECT '0' AS Col3, * 
    FROM Tabl1 
WHERE Col1 NOT LIKE '%c.txt' 
     AND Col2 = 'N'; 

P.S.私は受け入れられた答えと一致するようにこれをコード化しましたが、私はそれが正しいと確信していません!

関連する問題