0

我有一个 sql 查询。我想允许用户只修改单引号内的关系运算符或值

我的输入字符串是。

Select * from defect where Quantity < '9' and Date <= curdate() and Date >=
date_sub(curdate(), interval '3' month)

我正在尝试遵循模式来匹配上面的字符串。我还尝试了 ^ 开头和 $ 结尾。但无论如何都没有阳性结果

1. Select * from defect where Quantity [<|(>)|(=)|(<=)|(>=)|(like)] '.*' and
Date [<|(>)|(=)|(<=)|(>=)|(!=)|(like)] curdate() and Date [<|(>)|(=)|(<=)|(>=)
|(!=)|(like)] date_sub(curdate(), interval '.*' month)

2. Select * from defect where Quantity (<|(>)|(=)|(<=)|(>=)|(like)) '.*' and
Date (<|(>)|(=)|(<=)|(>=)|(!=)|(like)) curdate() and Date (<|(>)|(=)|(<=)|(>=)
|(!=)|(like)) date_sub(curdate(), interval '.*' month)

更新需要指导为什么我的模式与我的输入字符串不匹配。可能是什么错误?

4

2 回答 2

2

还有更多问题:您错误地使用了方括号:

[<|(>)|(=)|(<=)|(>=)|(like)]

意思是“下列字符中的一个:<>()|=eikl”。

使用括号而不是方括号,并合理分组:

([<>=]|[<>]=|like)

此外,您应该更具体:使用'[^']*'而不是'.*'.

最后,如果你想匹配一个文字括号,你需要在你的正则表达式中转义它:

date_sub\(curdate\(\), interval '[^']*' month\)
于 2012-09-22T16:21:18.450 回答
1

我找到了解决方案

我的模式 1 没问题,只是我必须在 '*' 之前放一个反斜杠,因为它在正则表达式中有特殊含义。反斜杠使其成为普通字符

Select \* from defect where Quantity [<|(>)|(=)|(<=)|(>=)|(like)] '.*' and
Date [<|(>)|(=)|(<=)|(>=)|(!=)|(like)] curdate() and Date [<|(>)|(=)|(<=)|(>=)
|(!=)|(like)] date_sub(curdate(), interval '.*' month)

这是一个简单的问题。我已经知道这条规则,但可以在几个小时后解决它。

更正[]用括号替换方括号()和反斜杠放在常量括号之前\(\)

Select \* from defect where Quantity (<|(>)|(=)|(<=)|(>=)|(like)) '.*' and
Date (<|(>)|(=)|(<=)|(>=)|(!=)|(like)) curdate\(\) and Date (<|(>)|(=)|(<=)|(>=)
|(!=)|(like)) date_sub\(curdate\(\), interval '.*' month\)
于 2012-09-22T16:19:36.500 回答