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

如何在Postgres/Prisma中查询含运算符符号的字符串?

解决Postgres中查询含+字符的编程语言名称问题

问题原因

你遇到的问题核心是URL查询参数的解析规则:当用户输入c+或c++作为查询条件时,浏览器会把+编码为URL中的空格符号,request.nextUrl.searchParams.get('q')拿到的实际值是c 或c (带空格),而非原始的c+/c++。用这个带空格的参数做ILIKE查询,自然匹配不到数据库里的C++、C#这类名称。

补充说明:Postgres的ILIKE本身不会把+当作通配符(通配符只有%和_),所以只要参数正确传递,就能正常匹配目标数据。

解决方案

1. 还原URL参数中的+字符

把searchParams.get()返回结果里的空格转回+,确保拿到原始查询内容:

const params = request.nextUrl.searchParams.get('q')?.replace(/ /g, '+') || '';
const query = `%${params}%`;
const langs = await prisma.$queryRaw`
SELECT lang 
FROM "ProgrammingLanguages" 
WHERE lang ILIKE ${query} 
ORDER BY LENGTH(lang) ASC;`;

2. (可选)处理LIKE通配符转义

如果后续需要支持查询含%、_这类LIKE特殊字符的名称,还需要对参数进行转义,并指定转义符:

// 转义LIKE的特殊字符:%、_、\
const escapeLikePattern = (str) => str.replace(/([%_\\])/g, '\\$1');

// 先还原+,再转义通配符
const rawParam = request.nextUrl.searchParams.get('q')?.replace(/ /g, '+') || '';
const query = `%${escapeLikePattern(rawParam)}%`;

const langs = await prisma.$queryRaw`
SELECT lang 
FROM "ProgrammingLanguages" 
WHERE lang ILIKE ${query} ESCAPE '\\'
ORDER BY LENGTH(lang) ASC;`;

验证

修改后再查询c++时,参数会被正确还原为c++,ILIKE %c++%就能匹配到数据库中的C++等相关条目。

内容的提问来源于stack exchange,提问作者nobunaga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:37:14