복붙노트

[SQL] 어떻게 Golang를 사용하여 SQL에서 IN 조회를 실행하려면?

SQL

어떻게 Golang를 사용하여 SQL에서 IN 조회를 실행하려면?

어떤 것은 이동이 SQL 쿼리에서 두 번째 PARAM 원하는 않습니다. 나는 포스트 그레스의 IN 조회를 사용하려합니다.

stmt, err := db.Prepare("SELECT * FROM awesome_table WHERE id= $1 AND other_field IN $2")
rows, err := stmt.Query(10, ???)

내가 정말 원하는 것 :

SELECT * FROM awesome_table WHERE id=10 AND other_field IN (this, that);

해결법

  1. ==============================

    1.소요 단지 쿼리는 SQL에 PARAMS을 대체 할 변수 인수 그래서, 당신의 예에서, 당신은 할 것

    소요 단지 쿼리는 SQL에 PARAMS을 대체 할 변수 인수 그래서, 당신의 예에서, 당신은 할 것

    rows, err := stmt.Query(10)
    

    말하자면,이 당신의 두 번째 예제의는 당신이 할 것, 동적했다

    stmt, err := db.Prepare("SELECT * FROM awesome_table WHERE id=$1 AND other_field IN ($2, $3)")
    rows, err := stmt.Query(10,"this","that")
    

    당신이 "IN"부분에 대한 변수 인수가있는 경우, 당신이 할 수있는 (재생)

    package main
    
    import "fmt"
    import "strings"
    
    func main() {
        stuff := []interface{}{"this", "that", "otherthing"}
        sql := "select * from foo where id=? and name in (?" + strings.Repeat(",?", len(stuff)-1) + ")"
        fmt.Println("SQL:", sql)
        args := []interface{}{10}
        args = append(args, stuff...)
        fakeExec(args...)
        // This also works, but I think it's harder for folks to read
        //fakeExec(append([]interface{}{10},stuff...)...)
    }
    
    func fakeExec(args ...interface{}) {
        fmt.Println("Got:", args)
    }
    
  2. ==============================

    2.당신은 PQ 드라이버를 사용하고있을 수 있습니다 것 같습니다. 최근 PQ (풀 요청 (466)을 참조)를 통해 포스트 그레스 pq.Array 특정 배열 지원. 당신은 당신을 통해 원하는 것을 얻을 수 있습니다 :

    당신은 PQ 드라이버를 사용하고있을 수 있습니다 것 같습니다. 최근 PQ (풀 요청 (466)을 참조)를 통해 포스트 그레스 pq.Array 특정 배열 지원. 당신은 당신을 통해 원하는 것을 얻을 수 있습니다 :

    stmt, err := db.Prepare("SELECT * FROM awesome_table WHERE id= $1 AND other_field = ANY($2)")
    rows, err := stmt.Query(10, pq.Array([]string{'this','that'})
    

    나는 이것이 SQL을 생성 생각 :

    SELECT * FROM awesome_table WHERE id=10 AND other_field = ANY('{"this", "that"}');
    

    입력이 살균해야하므로이, 준비된 문을 사용합니다.

  3. ==============================

    3.나 쿼리와 배열을 사용하려고 시도하는 것처럼 넣다 사람이 여기 쉬운 솔루션입니다.

    나 쿼리와 배열을 사용하려고 시도하는 것처럼 넣다 사람이 여기 쉬운 솔루션입니다.

    GET https://github.com/jmoiron/sqlx

    ids := []int{1, 2, 3}
    q,args,err := sqlx.In("SELECT id,username FROM users WHERE id IN(?);", ids) //creates the query string and arguments
    //you should check for errors of course
    q = sqlx.Rebind(sqlx.DOLLAR,q) //only if postgres
    rows, err := db.Query(q,args...) //use normal POSTGRES/ANY SQL driver important to include the '...' after the Slice(array)
    
  4. ==============================

    4.

    db.Query("select 1 = any($1::integer[])", "{1,2,3}")
    

    https://groups.google.com/d/msg/golang-nuts/vHbg09g7s2I/RKU7XsO25SIJ

  5. ==============================

    5.

    var awesome AwesomeStruct
    var awesomes []*AwesomeStruct
    
    ids := []int{1,2,3,4}
    q, args, err := sqlx.In(`
      SELECT * FROM awesome_table WHERE id=(?) AND other_field IN (?)`, 10, ids)
    
    // use .Select for multiple return
    err = db.Select(&awesomes, db.SQL.Rebind(q), args...)
    
    // use .Get for single return
    err = db.Get(&awesome, db.SQL.Rebind(q), args...)
    
  6. ==============================

    6.

    //I tried a different way. A simpler and easier way, maybe not too efficient.
    stringedIDs := fmt.Sprintf("%v", ids)
    stringedIDs = stringedIDs[1 : len(stringedIDs)-1]
    stringedIDs = strings.ReplaceAll(stringedIDs, " ", ",")
    query := "SELECT * FROM users WHERE id IN ("  + stringedIDs + ")"
    //Then follow your standard database/sql Query
    rows, err := db.Query(query)
    //error checking
    if err != nil {
        // Handle errors
    } else {
        // Process rows
    }
    
  7. ==============================

    7.서버가 생성 된 경우 오히려 보행자 만 사용할 수 있습니다. 어디에서 사용자 ID 문자열의 조각 (목록)입니다 :

    서버가 생성 된 경우 오히려 보행자 만 사용할 수 있습니다. 어디에서 사용자 ID 문자열의 조각 (목록)입니다 :

    sqlc := `select count(*) from test.Logins where UserID 
                    in ("` + strings.Join(UserIDs,`","`) + `")`
    errc := db.QueryRow(sqlc).Scan(&Logins)
    
  8. ==============================

    8.또한이 직접 변환을 사용할 수 있습니다.

    또한이 직접 변환을 사용할 수 있습니다.

    awesome_id_list := []int{3,5,8}
    
    var str string
    for _, value := range awesome_id_list {
            str += strconv.Itoa(value) + ","
    }
    
    query := "SELECT * FROM awesome_table WHERE id IN (" + str[:len(str)-1] + ")"
    

    경고 이 방법은 SQL 인젝션에 취약하다. awesome_id_list 서버가 생성 된 경우에만이 방법을 사용합니다.

  9. from https://stackoverflow.com/questions/20271123/how-to-execute-an-in-lookup-in-sql-using-golang by cc-by-sa and MIT license