如何从C#传递%字符串查询PostgreSQL含%或以%开头的记录
在C#中执行PostgreSQL的LIKE查询(匹配包含%或以%开头的记录)
PostgreSQL的LIKE语法里,%是通配符(匹配任意长度字符),如果要匹配字面意义的%字符(比如字段值包含%,或者以%开头),需要先在SQL层面转义,再通过C#参数化查询安全传递,避免SQL注入。
先明确SQL层面的正确写法
- 匹配包含%的记录:用转义符标记字面%,比如用
\作为转义符(PostgreSQL默认支持):
也可以自定义转义符,比如用SELECT * FROM somepostgrestable WHERE table_column LIKE '%\%%' ESCAPE '\' LIMIT 5;#:SELECT * FROM somepostgrestable WHERE table_column LIKE '%#%%' ESCAPE '#' LIMIT 5; - 匹配以%开头的记录:
SELECT * FROM somepostgrestable WHERE table_column LIKE '\%%' ESCAPE '\' LIMIT 5;
C#中用Npgsql驱动实现(参数化查询)
方法1:手动指定转义符传递参数
C#中需要转义反斜杠(写成\\),然后通过参数化传递,避免直接拼接字符串:
using Npgsql; var connString = "Host=localhost;Username=postgres;Password=你的密码;Database=你的数据库"; // 1. 查询包含%的记录 var containsPattern = "%\\%%"; using (var conn = new NpgsqlConnection(connString)) { conn.Open(); using (var cmd = new NpgsqlCommand(@" SELECT * FROM somepostgrestable WHERE table_column LIKE @pattern ESCAPE '\' LIMIT 5;", conn)) { cmd.Parameters.AddWithValue("@pattern", containsPattern); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { // 处理查询结果,比如输出字段值 Console.WriteLine(reader["table_column"]); } } } } // 2. 查询以%开头的记录 var startsWithPattern = "\\%%"; using (var conn = new NpgsqlConnection(connString)) { conn.Open(); using (var cmd = new NpgsqlCommand(@" SELECT * FROM somepostgrestable WHERE table_column LIKE @pattern ESCAPE '\' LIMIT 5;", conn)) { cmd.Parameters.AddWithValue("@pattern", startsWithPattern); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["table_column"]); } } } }
方法2:用Npgsql的自动转义助手
Npgsql提供了NpgsqlDbType.Like参数类型,会自动处理通配符转义,不需要手动写转义符:
using Npgsql; using NpgsqlTypes; var connString = "Host=localhost;Username=postgres;Password=你的密码;Database=你的数据库"; var targetChar = "%"; // 要匹配的字面% // 1. 查询包含%的记录 using (var conn = new NpgsqlConnection(connString)) { conn.Open(); using (var cmd = new NpgsqlCommand(@" SELECT * FROM somepostgrestable WHERE table_column LIKE '%' || @target || '%' LIMIT 5;", conn)) { // 指定参数类型为Like,自动转义 cmd.Parameters.Add("@target", NpgsqlDbType.Like).Value = targetChar; using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["table_column"]); } } } } // 2. 查询以%开头的记录 using (var conn = new NpgsqlConnection(connString)) { conn.Open(); using (var cmd = new NpgsqlCommand(@" SELECT * FROM somepostgrestable WHERE table_column LIKE @target || '%' LIMIT 5;", conn)) { cmd.Parameters.Add("@target", NpgsqlDbType.Like).Value = targetChar; using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["table_column"]); } } } }
EF Core中的实现(Npgsql.EntityFrameworkCore.PostgreSQL)
如果用EF Core操作PostgreSQL,直接用EF.Functions.Like即可,框架会自动处理参数化和转义:
using Microsoft.EntityFrameworkCore; // 假设你的DbContext定义了DbSet<SomePostgreTable> SomePostgreTables; var target = "%"; // 查询包含%的记录 var containsResults = await dbContext.SomePostgreTables .Where(t => EF.Functions.Like(t.TableColumn, $"%{target}%")) .Take(5) .ToListAsync(); // 查询以%开头的记录 var startsWithResults = await dbContext.SomePostgreTables .Where(t => EF.Functions.Like(t.TableColumn, $"{target}%")) .Take(5) .ToListAsync();
重要提醒
绝对不要直接拼接用户输入或变量到SQL语句中,比如"WHERE table_column LIKE '%%" + input + "%'",这会引发严重的SQL注入漏洞。始终使用参数化查询。
内容的提问来源于stack exchange,提问作者Ramaswamy
相关产品推荐
相关产品推荐

