[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.소요 단지 쿼리는 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.당신은 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.나 쿼리와 배열을 사용하려고 시도하는 것처럼 넣다 사람이 여기 쉬운 솔루션입니다.
나 쿼리와 배열을 사용하려고 시도하는 것처럼 넣다 사람이 여기 쉬운 솔루션입니다.
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.
db.Query("select 1 = any($1::integer[])", "{1,2,3}")
https://groups.google.com/d/msg/golang-nuts/vHbg09g7s2I/RKU7XsO25SIJ
-
==============================
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.
//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.서버가 생성 된 경우 오히려 보행자 만 사용할 수 있습니다. 어디에서 사용자 ID 문자열의 조각 (목록)입니다 :
서버가 생성 된 경우 오히려 보행자 만 사용할 수 있습니다. 어디에서 사용자 ID 문자열의 조각 (목록)입니다 :
sqlc := `select count(*) from test.Logins where UserID in ("` + strings.Join(UserIDs,`","`) + `")` errc := db.QueryRow(sqlc).Scan(&Logins)
-
==============================
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 서버가 생성 된 경우에만이 방법을 사용합니다.
from https://stackoverflow.com/questions/20271123/how-to-execute-an-in-lookup-in-sql-using-golang by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] mysql을 / SQLSERVER에서 삭제 대 잘라야의 비교 [중복] (0) | 2020.06.03 |
---|---|
[SQL] PostgreSQL의 배열 요소 순서와 배열 형으로 가입, 어떻게 구현하는 방법? (0) | 2020.06.03 |
[SQL] 이 파일의 데이터에 액세스하거나 데이터베이스 서버에 빠른가요? (0) | 2020.06.03 |
[SQL] 시간 부분을 무시 T-SQL에서 비교 날짜, (0) | 2020.06.02 |
[SQL] 어떻게 Laravel 5.1 원시 쿼리를 실행하려면? (0) | 2020.06.02 |