【发布时间】:2015-05-14 10:56:44
【问题描述】:
我尝试在管道分隔的字符串中匹配数字 13,如下所示:
13 - match
1|2|13 - match
13|1|2 - match
1|13|2 - match
1345|1|2 - should fail
1|1345|2 - should fail
1|2|1345 - should fail
1|4513|2 - should fail
4513|1|2 - should fail
2|3|4|4513- should fail
所以,如果13 只出现在开头或结尾,或者在字符串之间作为一个整体,它应该匹配。
为此,我编写了以下正则表达式:
^13$|(\|13\|)?(?(1)|(^13\||\|13$))
在Regex101 中,它按预期工作。请点击链接查看我的示例。
但在 Postgresql 中,它会为以下查询引发错误:
SELECT * FROM tbl_privilage WHERE user_id = 24 and show_id ~ '^13$|(\|13\|)?(?(1)|(^13\||\|13$))';
错误:
错误:无效的正则表达式:量词操作数无效
SQL 状态:2201B
【问题讨论】:
-
"管道分隔字符串",你为什么要这样存储你的数据?这会产生大量问题,您的正则表达式只是众多问题之一。尝试修复真正的问题,即您的数据模型,而不是为了修复错误而修复错误。
-
@FrankHeikens 我已经问过为什么我们不遵循规范化但他们强迫我通过正则表达式检查它我们不应该像人们回答我的那样改变架构设计而且我也没有权利:(
-
如果您不/不能规范化,请至少使用一个 ARRAY。仍然是一种解决方法,但比一个问题要好得多。
-
@FrankHeikens 感谢您的建议,因为我没有对生产环境的数据库访问权限,我已经建议高级官员使用任何集合对象,如您所说的数组,但他们说我们已经开发了很多 php 代码取决于这个管道分隔值,所以没有办法改变它。您只是尝试使用模式匹配来完成此任务,因此我使用正则表达式进行了尝试。但我喜欢使用 a_horse_with_no_name 答案。再次感谢您的反馈。
标签: regex postgresql