sql >> データベース >  >> RDS >> Mysql

非IN条件でも準備されたSQLステートメントのIN条件に[]スライスを渡すにはどうすればよいですか?

    ただし、解決策があります。まず第一に、私たちができるのは 爆発するパラメータが1つだけで、他にはない場合は、最初にパラメータを1つの[]sliceにまとめる必要があります。 :

    var params []interface{}
    params = append(params, Type)
    for _, subtype := range SubTypes {
      params = append(params, SubTypes)
    }
    

    SQLはそれ自体では拡張されないため、そのループを拡張してみましょう。

    var params []interface{}
    params = append(params, Type)
    inCondition := ""
    for _, subtype := range SubTypes {
      params = append(params, SubTypes)
      if inCondition != "" {
        inCondition += ", "
      }
      inCondition += "?"
    }
    

    SubTypesを想定 []int{1,2,3}が含まれています 、inCondition ?, ?, ?が含まれている必要があります 。

    次に、それをSQLステートメントに結合し、引数を展開します。

    sqlstr := fmt.Sprintf(`SELECT *
      FROM foo
      WHERE type = ?
        AND subtype IN (%s)`, inCodition)
    rows, err := sqldb.Query(sqlstr, params...)
    

    もちろん、[]sliceを渡すだけでかなりクールになります sを準備したステートメントに追加すると、自動的に展開されます。ただし、より多くの「不明な」データを処理している場合は、予期しない結果が生じる可能性があります。



    1. SQL正確な複数の関係が存在する行のみを選択します

    2. レプリケーションに使用されるEBSボリュームのスナップショット

    3. 存在するかどうかを確認し、存在する場合は1 ++で更新し、存在しない場合は挿入します

    4. SQL-2つの列で同じ値を持つ行を選択します