示例:
表是:
所以我希望在任何一方有或没有任何非数字值的情况下返回'123'和'456'。 所以:
一切都很好。
但是
01234
不是我想要的东西。
所以我的查询应该返回行'1'和'2'而不是3.
答案 0 :(得分:2)
如果您想使用正则表达式,请使用不应包含在您想要匹配的部分两侧的内容。通常情况下,如果您正在寻找"整个单词"在一个字符串中。
根据https://dev.mysql.com/doc/refman/5.7/en/regexp.html
[[:<:]],[[:>:]]
这些标记代表字边界。它们分别匹配单词的开头和结尾。单词是一系列单词字符,其前面或后面没有单词字符。单词字符是alnum类中的字母数字字符或下划线(_)。
所以尝试这样的事情:(删除点将要求123/456不在中间某处)
Select * from TABLE where data REGEXP '[[:<:]](123|456)[[:>:]]';
答案 1 :(得分:1)
为什么不将LIKE
与通配符一起使用?
答案 2 :(得分:0)
如果您想使用regexp
,请使用:
select * from TABLE where data REGEXP '(123).*(456)';
select '--- my name is 123 and my 456 is 789' REGEXP '(123).*(456)' ;
返回1
select '--- my name is 321 and my 654 is 987' REGEXP '(123).*(456)' ;
返回0
select '--- my name is 1234 and my 2 is 1' REGEXP '(123).*(456)' ;
返回0
答案 3 :(得分:0)
SELECT * FROM TABLE
WHERE data LIKE '% 123 %'
AND data LIKE '% 456 %'
我宁愿采用这种方式尝试使用LIKE
通配符代替regexp
。
此查询将SELECT
&#34;全部&#34; FROM
表WHERE
DATA
有一个字符串&#34; 123&#34;并且DATA
有一个字符串&#34; 456&#34;。
修改强>
在%和数字之间添加了空格,以便它不会在更长的字符串中搜索字符串(例如,它不会在内部找到456&#39; 123456789&#39;不再,但会在里面找到它&#39; 123 456 789&#39;)。
<强> EDIT2:强>
实际上,如果您的字符串被空格包围,上面给出的示例将起作用。实际上regexp
可能更适合您的情况。如下所述,我建议使用像这样的字边界:
SELECT * FROM TABLE
WHERE DATA REGEXP '[[:<:]]123[[:>:]]';
AND DATA REGEXP '[[:<:]]456[[:>:]]';
<强> EDIT3:强>
在你的情况下,完美的方式如下:
SELECT * FROM TABLE
WHERE DATA REGEXP '(^|[^0-9])123([^0-9]|$)';
AND DATA REGEXP '(^|[^0-9])456([^0-9]|$)';
在http://regexp.pl/进行测试,您可以将语言切换为ENG并尝试使用这些语言,或者只是在您的脚本上检查它们。
答案 4 :(得分:0)
Select ID from Table
where patindex('%123%', Data) <> 0
and patindex('%456%',Data) <> 0