如何在PostgreSQL中用变量指定查询列名?(使用sqlc)
解决动态字段匹配的PostgreSQL查询问题
你之前的写法核心问题是字符串常量的引号使用错误:PostgreSQL里双引号"name"会被解析为标识符(比如列名),而非字符串字面量,所以$1 = "name"永远不会匹配成功——你传入的$1是字符串"name",而"name"在这里代表列名,两者类型完全不匹配。
推荐写法(兼顾性能与正确性)
为了避免索引失效(如果name或id字段有索引的话),建议拆分为明确的条件分支,这种写法能让PostgreSQL针对每个分支使用对应字段的索引:
SELECT * FROM some_table WHERE ( $1 = 'name' AND name = $2 ) OR ( $1 = 'id' AND id = $2 );
如果需要支持更多字段,只需继续添加OR分支即可,同时要确保$1只能传入预定义的合法字段名(避免SQL注入,sqlc的参数绑定机制已经帮你规避了大部分风险)。
修正后的CASE表达式写法(不推荐用于大数据量场景)
如果你坚持要用CASE表达式,只需把字符串常量改成单引号包裹即可,但这种写法会导致数据库无法使用name或id的索引,数据量大时性能会受影响:
SELECT * FROM some_table WHERE CASE WHEN $1 = 'name' THEN name ELSE id END = $2;
内容的提问来源于stack exchange,提问作者Maya Saias
相关产品推荐
相关产品推荐

