不确定如何标题我的问题......哈哈。
以下是我的需要。
我的数据库中的值如下所示:test_example-1,test_example-2,test_example-TD-1
值的长度可能不同,“test_example-”只是一个示例,其中一些值将具有不同的名称。
当我执行查询以获取看起来像这个“test_example-”的所有值时,我得到了所有内容,因为我以这种方式使用外卡值“test_example-%”。但是,我不希望结果中出现“test_example-TD-1”。我只想要NON-TD值。那么,我怎么能得到所有的“test_example-”而不会得到“ - ”之后只有一个数字整数的东西。
数据库中的值不会超过“ - ”后面的单个数字(0-9)。所以基本上我需要一个查询,搜索看起来像这个“test_example- [0-9]”的值。
我该怎么做?如果这令人困惑并需要澄清,请告诉我。谢谢!
这是我正在做的确切查询以缓解一些混淆:
SELECT MAC, NAME FROM HOST WHERE NAME LIKE (SELECT CONCAT(LEFT(NAME, LENGTH(NAME)-1), "%") FROM HOST WHERE MAC="some mac address");
这是工作结果(感谢swati):
SELECT MAC, NAME FROM HOST WHERE NAME REGEXP CONCAT(LEFT(NAME, LENGTH(NAME)-1), "[0-9]+") AND MAC="some mac address";
答案 0 :(得分:2)
SELECT * FROM `foo` WHERE `value` REGEXP "test_example-[:digit:]+"
这应该适用于test_example- [0-9]。更多关于Character Classes and REGEXP
根据您的查询,它将是:
SELECT MAC, NAME FROM HOST WHERE NAME REGEXP CONCAT(LEFT(NAME, LENGTH(NAME)-1), "[0-9]+") AND MAC="some mac address"
请注意,您发布的查询中存在错误 - 您有两个WHERE子句。
答案 1 :(得分:1)
where substring(field,locate('-',field)+1,1) in ('1','2','3','4','5','6','7','8','9','0')
答案 2 :(得分:1)
您可以尝试使用regexp,但我不知道它会有多高效。您可能希望在代码中而不是在sql中执行此操作。但仍然:
SELECT * FROM `foo` WHERE `value` REGEXP "yourRegexp"
只需创建满足您需求的任何正则表达式。
答案 3 :(得分:1)
您可以使用下划线字符作为单个字符的通配符。
"test_example-_"