none
検索の方法-SQL文 RRS feed

  • 質問

  • 【環境:SQLServer2005、WindowsXP】

    いつもお世話になっております。

     

    SQLのデータ取得で頭を悩ましているのですが、

     

    Aテーブル

    Field1 Field2

    AA   1,2,3

    BB   3,4,5

     

    データ取得時、引数で、値には、

    1 や 3と4 等

    色々なパターンがあります。

    その引数とField2を照らし合わせ、ヒットしたデータを取得したいのです。

     

    つまり、

    1

    の条件では

    AA取得

     

    3

    の条件では

    AAとBB

     

    1と3

    の条件では

    AA

     

    という風なSQL文を考えているのですが、引数の値を複数してした場合、浮かびません。

    有識者の方ご享受宜しくお願い致します。

     

     

    また、上記が一発で無理であるならば、下記の構想も練っています。

    Aテーブル

    Field1 Field2

    AA   1

    AA   2

    AA   3

    BB   3

    BB   4

    BB   5

     

    ただ、この場合でも、

    INでは、いらないデータが取れますし、

    and では必要なデータがとれません。

     

     

    併せてご享受宜しくお願い致します。

    2007年8月24日 2:37

回答

  • どうも、vbだったら


        Private Function CreateSelectSQL(ByVal condition As ArrayList) As String
            Dim query As New System.Text.StringBuilder
            With query
                .Append("SELECT Field1")
                .Append("  FROM A")
                For i As Integer = 0 To condition.Count - 1
                    If i = 0 Then
                        .Append(" WHERE ")
                    Else
                        .Append(" AND ")
                    End If
                    .Append(" Field2 LIKE '%").Append(condition(i).ToString).Append("%'")

                Next
            End With

            Return query.ToString
        End Function

     

    みたいなメソッドを用意して、


                Dim list As New ArrayList
                list.Add("1")
                list.Add("3")
                Dim sql As String = CreateSelectSQL(list)

     

    こんな感じで呼べば出来ると思います。

    ちなみに上記の結果は

       SELECT Field1  FROM A WHERE  Field2 LIKE '%1%' AND  Field2 LIKE '%3%'

    ※ただし、レスポンスは良くないかもしれません。
    2007年8月24日 5:04
  • 先程のを少し変えて、


        Private Function CreateSelectSQL(ByVal condition As ArrayList) As String
            Dim query As New System.Text.StringBuilder
            With query
                .Append("SELECT Field1")
                .Append("  FROM A")
                For i As Integer = 0 To condition.Count - 1
                    If i = 0 Then
                        .Append(" WHERE ")
                    Else
                        .Append(" AND ")
                    End If
                    .Append("(")
                    .Append(" Field2 = '").Append(condition(i).ToString).Append("'")
                    .Append(" OR ")
                    .Append(" Field2 LIKE '").Append(condition(i).ToString).Append(",%'")
                    .Append(" OR ")
                    .Append(" Field2 LIKE '%,").Append(condition(i).ToString).Append(",%'")
                    .Append(" OR ")
                    .Append(" Field2 LIKE '%,").Append(condition(i).ToString).Append("'")
                    .Append(")")
                Next
            End With

            Return query.ToString
        End Function

     

    これでいいんじゃないでしょうか。ちなみに

    SELECT Field1  FROM A

     WHERE ( Field2 = '1' OR  Field2 LIKE '1,%' OR  Field2 LIKE '%,1,%' OR  Field2 LIKE '%,1')

     AND ( Field2 = '3' OR  Field2 LIKE '3,%' OR  Field2 LIKE '%,3,%' OR  Field2 LIKE '%,3')

     

    ※ただし重ねて申し上げますがレスポンスは信用出来ません。

    2007年8月24日 6:15

すべての返信

  • どうも、vbだったら


        Private Function CreateSelectSQL(ByVal condition As ArrayList) As String
            Dim query As New System.Text.StringBuilder
            With query
                .Append("SELECT Field1")
                .Append("  FROM A")
                For i As Integer = 0 To condition.Count - 1
                    If i = 0 Then
                        .Append(" WHERE ")
                    Else
                        .Append(" AND ")
                    End If
                    .Append(" Field2 LIKE '%").Append(condition(i).ToString).Append("%'")

                Next
            End With

            Return query.ToString
        End Function

     

    みたいなメソッドを用意して、


                Dim list As New ArrayList
                list.Add("1")
                list.Add("3")
                Dim sql As String = CreateSelectSQL(list)

     

    こんな感じで呼べば出来ると思います。

    ちなみに上記の結果は

       SELECT Field1  FROM A WHERE  Field2 LIKE '%1%' AND  Field2 LIKE '%3%'

    ※ただし、レスポンスは良くないかもしれません。
    2007年8月24日 5:04
  • ご返信ありがとうございます。

     

    Likeは、11もヒットしてしまうのです。。。

     

    先ほどのField2は、数字で、1もあるし11もあるのです。。。

     

    引き続きご享受賜れば幸いです。

    2007年8月24日 5:18
  • 先程のを少し変えて、


        Private Function CreateSelectSQL(ByVal condition As ArrayList) As String
            Dim query As New System.Text.StringBuilder
            With query
                .Append("SELECT Field1")
                .Append("  FROM A")
                For i As Integer = 0 To condition.Count - 1
                    If i = 0 Then
                        .Append(" WHERE ")
                    Else
                        .Append(" AND ")
                    End If
                    .Append("(")
                    .Append(" Field2 = '").Append(condition(i).ToString).Append("'")
                    .Append(" OR ")
                    .Append(" Field2 LIKE '").Append(condition(i).ToString).Append(",%'")
                    .Append(" OR ")
                    .Append(" Field2 LIKE '%,").Append(condition(i).ToString).Append(",%'")
                    .Append(" OR ")
                    .Append(" Field2 LIKE '%,").Append(condition(i).ToString).Append("'")
                    .Append(")")
                Next
            End With

            Return query.ToString
        End Function

     

    これでいいんじゃないでしょうか。ちなみに

    SELECT Field1  FROM A

     WHERE ( Field2 = '1' OR  Field2 LIKE '1,%' OR  Field2 LIKE '%,1,%' OR  Field2 LIKE '%,1')

     AND ( Field2 = '3' OR  Field2 LIKE '3,%' OR  Field2 LIKE '%,3,%' OR  Field2 LIKE '%,3')

     

    ※ただし重ねて申し上げますがレスポンスは信用出来ません。

    2007年8月24日 6:15
  • なるほど。

     

    データがカンマ区切りの場合、こういうやり方があるんですね。

     

    レスポンスの問題は実行してみない事には分りませんが、

    兎に角実現はできそうです。

     

     

    どうもありがとうございました!

    2007年8月24日 6:58
  • yuji_amk さん、

     

    こんにちは!
    フォーラム オペレーターの服部 清次です。

     

    こちらは少し昔のスレッドですが、今回、aviator!! さんの回答が役に立ったようですので、私の方で [回答済み] チェックを付けさせていただきました。
    もしまだ問題が解決していない場合は、質問を続けていただくこともできますので、遠慮なく [回答済み] チェックを外して返信してください。

     

    TechNet フォーラムへのまたのご参加をお待ちしています。
    それでは、また!

     


    ____________________________________________
    マイクロソフト株式会社 フォーラム オペレータ 服部 清次

    2008年12月12日 5:50