You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:05:21