我在 golang 中的 Postgres 查询有什么问题(LIKE 匹配)

What's wrong with my Postgres query inside of golang (LIKE matching)

我见过一个非常相似的问题 here,但我不确定管道在命令中的作用,而且它对我不起作用。

所以,这是我试过的代码。

rows, err := db.Query(fmt.Sprintf("SELECT * FROM mytable WHERE mycolumn LIKE 'camel.%'"))

虽然我不知道它是干什么用的,但我也试过用管道。

rows, err := db.Query(fmt.Sprintf("SELECT * FROM mytable WHERE mycolumn LIKE 'camel. || %'"))

所以,它应该做的是匹配该列中以 camel. 开头的任何内容,所以 camel.*

我在这两个示例中得到的错误是

pq: syntax error at or near "("

所以我猜出于某种原因,它作为命令传递的那一行比我想要的要多......也许是报价问题?我尝试了一些其他的东西,但没有任何效果。感谢任何帮助。

func Sprintf(format string, a ...interface{}) string

Sprintf formats according to a format specifier and returns the resulting string.

mt.Println(fmt.Sprintf("SELECT * FROM mytable WHERE mycolumn LIKE 'camel%'"))

//Output:
//SELECT * FROM mytable WHERE mycolumn LIKE 'camel%!'(MISSING)
//Ofc postgres will complain

在这种情况下,您不需要 fmt.Sprintf

rows, err := db.Query("SELECT * FROM mytable WHERE mycolumn LIKE 'camel.%'")

工作正常。

但是如果你真的需要使用fmt.Sprintf你必须用'%%'转义'%'

rows, err := db.Query(fmt.Sprintf("SELECT * FROM mytable WHERE mycolumn LIKE 'camel.%%'"))

为了安全起见,您应该使用准备好的语句进行查询,您可以使用 CONCAT 进行连接:

rows, err := db.Query("SELECT * FROM mytable WHERE mycolumn LIKE CONCAT(?, '%')", camel)

希望对您有所帮助!

您可以使用 LIKE '%' || camel. || '%'