none
select 文について教えてください RRS feed

  • 質問

  • SQL Server 2005 を使用しています。
    以下の商品テーブルがあります。NUMには主キーありです。

    select 文を発行して
    NUM の最後に A が付いているデータ(類似のデータは無視)と
    A が付いていないデータを取得するには どのような select 文を書けば
    よいのでしょうか? お教えください。

    テーブル名:商品
    NUM         商品Index     本体     定価   以降省略
    0-001       100-0020    1000    1050
    0-002       100-0030    2000    2100
    0-003       100-0040    3000    3150   (これ以降 下のデータと同じとは限らない)
    0-003A     100-0040    3000    3150   (これ以降 上のデータと同じとは限らない)
    0-004       100-0050    1500    1575
    0-005       100-0060    2500    2625
    0-005A     100-0060    2500    2625
    0-006       100-0070    1000    1050

    希望する結果
    0-001       100-0020    1000    1050
    0-002       100-0030    2000    2100
    0-003A     100-0040    3000    3150
    0-004       100-0050    1500    1575
    0-005A     100-0060    2500    2625
    0-006       100-0070    1000    1050

    2012年8月1日 7:19

回答

  • 答えを直接書くしかないのかなぁ…。IN / NOT INを使うことで一覧に含まれるもの/含まれないものを検索できます。これがわかれば、Aが付いている一覧+Aが付いていない一覧をUNIONでつなぎ合わせるだけです。

    -- Aが付いている一覧
    SELECT NUM, 商品index, 本体, 定価 FROM 商品 WHERE NUM LIKE '%A'
    
    -- Aが付いている一覧のNUMから末尾の1文字'A'を取り除いたもの
    SELECT SUBSTRING(NUM, 0, LEN(NUM)-1) FROM 商品 WHERE NUM LIKE '%A'
    
    -- Aが付いていない一覧
    SELECT NUM, 商品index, 本体, 定価 FROM 商品 WHERE NUM NOT LIKE '%A' AND NUM NOT IN (SELECT SUBSTRING(NUM, 0, LEN(NUM)-1) FROM 商品 WHERE NUM LIKE '%A')
    
    -- Aが付いている一覧と付いていない一覧
    SELECT NUM, 商品index, 本体, 定価 FROM 商品 WHERE NUM LIKE '%A'
    UNION ALL
    SELECT NUM, 商品index, 本体, 定価 FROM 商品 WHERE NUM NOT LIKE '%A' AND NUM NOT IN (SELECT SUBSTRING(NUM, 0, LEN(NUM)-1) FROM 商品 WHERE NUM LIKE '%A')
    

    • 回答としてマーク mcioh 2012年8月1日 8:22
    2012年8月1日 7:43

すべての返信

  • 答えを直接書くしかないのかなぁ…。IN / NOT INを使うことで一覧に含まれるもの/含まれないものを検索できます。これがわかれば、Aが付いている一覧+Aが付いていない一覧をUNIONでつなぎ合わせるだけです。

    -- Aが付いている一覧
    SELECT NUM, 商品index, 本体, 定価 FROM 商品 WHERE NUM LIKE '%A'
    
    -- Aが付いている一覧のNUMから末尾の1文字'A'を取り除いたもの
    SELECT SUBSTRING(NUM, 0, LEN(NUM)-1) FROM 商品 WHERE NUM LIKE '%A'
    
    -- Aが付いていない一覧
    SELECT NUM, 商品index, 本体, 定価 FROM 商品 WHERE NUM NOT LIKE '%A' AND NUM NOT IN (SELECT SUBSTRING(NUM, 0, LEN(NUM)-1) FROM 商品 WHERE NUM LIKE '%A')
    
    -- Aが付いている一覧と付いていない一覧
    SELECT NUM, 商品index, 本体, 定価 FROM 商品 WHERE NUM LIKE '%A'
    UNION ALL
    SELECT NUM, 商品index, 本体, 定価 FROM 商品 WHERE NUM NOT LIKE '%A' AND NUM NOT IN (SELECT SUBSTRING(NUM, 0, LEN(NUM)-1) FROM 商品 WHERE NUM LIKE '%A')
    

    • 回答としてマーク mcioh 2012年8月1日 8:22
    2012年8月1日 7:43
  • 佐祐理 様

    丁寧なご説明ありがとうございます。
    問題の解き方の考え方から教えていただきよくわかりました。

    実は以下の部分を変更いたしました。
     SUBSTRING(NUM, 0, LEN(NUM)-1)
     SUBSTRING(NUM, 1, LEN(NUM)-1)     // 1 にしました。

    希望する結果を取得することができました。
    大変ありがとうございました。

    2012年8月1日 8:22