2017-04-14 29 views
0

我有以下代码:IN pq.Array不能通过值

package main 

import (
    "database/sql" 
    "fmt" 
    "github.com/lib/pq" 
) 

const (
    DB_USER  = "<username>" 
    DB_PASSWORD = "<password>" 
    DB_NAME  = "<db>" 
) 

func main() { 
    dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable", 
    DB_USER, DB_PASSWORD, DB_NAME) 

    db, err := sql.Open("postgres", dbinfo) 
    checkErr(err) 
    defer db.Close() 

    fmt.Println("# Querying with blacklist in SQL") 
    rows, err := db.Query(` 
    SELECT * FROM(
     SELECT x from (values ('A'), ('B'), ('C')) s(x) 
    ) As Res1 WHERE x NOT IN ('A'); 
`) 
    checkErr(err) 

    for rows.Next() { 
     var str string 
     err = rows.Scan(&str) 
     fmt.Println(str) // Prints B,C 
    } 

    fmt.Println("Querying with blacklist in Golang") 
    blacklist := []string{"A"} 

    q := ` 
    SELECT * FROM(
     SELECT x from (values ('A'), ('B'), ('C')) s(x) 
    ) As Res1 WHERE x NOT IN ($1); 

` 
    rows, err = db.Query(q, pq.Array(blacklist)) 
    checkErr(err) 

    for rows.Next() { 
     var str string 
     err = rows.Scan(&str) 
     fmt.Println(str) // Prints A, B, C 
    } 
} 

func checkErr(err error) { 
    if err != nil { 
     panic(err) 
    } 
} 

其中我通过pq.Array作为参数传递给一个Golang Postgres的格式字符串$ 1中。但是该参数无法通过。当我期望输出B,C时,程序正在打印A,B,C

# Querying with blacklist in SQL 
B 
C 
Querying with blacklist in Golang 
A 
B 
C 

回答

3

的Postgres的IN并不需要一个数组例如像ANYALL这是在那里你可以使用pq.Array

而不是使用x NOT IN($1)您可以使用x <> ALL($1)

ALL的文档。

使用给定的运算符评估左边表达式并将其与每个元素 进行比较,该运算符必须产生布尔结果。 如果所有比较均为真(包括 数组为零的情况),则ALL的结果为“true”。如果发现 任何错误结果,则结果为“false”。