postgres 准备好的语句中的条件

Conditions in prepared statements in postgres

我需要在 postgres 的准备语句中添加一个条件。

伪代码(不起作用,引发错误“WHERE 的参数必须是布尔类型,而不是文本类型”):

if (nameFilter) {
 whereParam = `name LIKE %${nameFilter}%`
} else {
 whereParam = "true"
}
let query = prepare("SELECT * FROM users WHERE ", whereParam);

伪代码(有效但看起来很丑):

if (nameFilter) {
 likeParam = `%${nameFilter}%`
} else {
 likeParam = "%"
}
let query = prepare("SELECT * FROM users WHERE name LIKE ", likeParam);

出于某些原因(使用一堆 AND 查询真的很复杂)无法使用字符串进行操作,因此这无济于事

if (nameFilter) {
 q = `SELECT * FROM users WHERE name LIKE `
} else {
 q = "SELECT * FROM users"
}
let query = prepare(q, nameFilter);

希望有类似于SELECT * FROM users WHERE AND AND ...

的声明

有什么建议吗?

此查询适合您。

select * from users where
  case
    when coalesce(, '') = '' then true 
    else (name ~ )
  end;

唯一可以作为参数传递的是常量;您不能传递 SQL 查询的一部分,例如 name LIKE '%pattern%'.

所以如果你的查询真的每次都不一样,你必须在你的代码中构造 SQL 字符串,就像你说你“由于某些原因”不能这样做一样。

虽然很烦,但也没有别的办法

当您构建 SQL 语句时,请确保您永远不会像这样连接字符串:

sql = "SELECT * FROM users WHERE username ='" + username + "'"

因为这很容易受到 SQL 注入的攻击。