pgsql 筛选中文字符正则_正则表达式 – PostgreSQL:正则表达式转义函数

为了放弃阅读整个问题,我的基本问题是:

PostgreSQL中是否有一个函数来转义字符串中的正则表达式字符?

我已经探测过文档,但无法找到这样的功能.

这是完整的问题:

在PostgreSQL数据库中,我有一个包含唯一名称的列.我还有一个定期在此字段中插入名称的进程,并且为了防止重复,如果需要输入已存在的名称,它会在末尾附加一个空格和括号.

即姓名,姓名(1),姓名(2),姓名(3)等

就目前而言,我使用以下代码来查找要在系列中添加的下一个数字(用plpgsql编写):

var_name_id := 1;

SELECT CAST(substring(a.name from E'\\((\\d+)\\)$') AS int)

INTO var_last_name_id

FROM my_table.names a

WHERE a.name LIKE var_name || ' (%)'

ORDER BY CAST(substring(a.name from E'\\((\\d+)\\)$') AS int) DESC

LIMIT 1;

IF var_last_name_id IS NOT NULL THEN

var_name_id = var_last_name_id + 1;

END IF;

var_new_name := var_name || ' (' || var_name_id || ')';

(var_name包含我要插入的名称.)

这适用于现在,但问题在于WHERE语句:

WHERE a.name LIKE var_name || ' (%)'

此检查不会验证所讨论的%是否为数字,并且它不会考虑多个括号,如“Name((1))”,如果存在任何一种情况,则会抛出强制转换异常.

WHERE语句确实需要更像:

WHERE a.r1_name ~* var_name || E' \\(\\d+\\)'

但var_name可能包含正则表达式字符,这导致上面的问题:PostgreSQL中是否有一个函数可以转义字符串中的正则表达式字符,所以我可以这样做:

WHERE a.r1_name ~* regex_escape(var_name) || E' \\(\\d+\\)'

非常感谢任何建议,包括可能重复我的重复名称解决方案.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值