不使用正则表达式的字母和数字排列的 SQL 匹配
Posted
技术标签:
【中文标题】不使用正则表达式的字母和数字排列的 SQL 匹配【英文标题】:SQL match on letter and number arrangement without using regular expressions 【发布时间】:2011-02-21 10:18:02 【问题描述】:是否可以在不使用 REGEXP 的情况下为 mysql 编写一条 SQL 语句来查找与特定字母/数字排列匹配的所有行?
即SELECT myCol FROM myTable WHERE myCol='numbernumberletter'
应该返回 12X 和 34Y 但不是 123X 或 34YY
[我之前也问过类似的问题-( SQL match on letter and number arrangement)。不同之处在于我发现我无法将正则表达式与我正在使用的 ADO.Net 驱动程序一起使用。更重要的是,我无法更新它,因为我使用的是与更高版本不兼容的 Visual Studio 2003。]
【问题讨论】:
你能再解释一下吗。为什么不能匹配34YY
?
好吧,看来您应该更改示例中的模式或为正确答案选择不同的值。该模式表示 letterletternumber,而您的正确值是 numbernumberletter。 (我相信,您所说的 number 是指 digit。)除此之外,我认为您的想法基本上很清楚。
@Sachin 34YY 最后多了一个不需要的字母,所以它不应该匹配。
@Andriy 对不起,错字。 (我似乎很擅长他们)。现在已经更正了。
【参考方案1】:
试试这个:
SELECT myCol
FROM myTable
WHERE SUBSTRING(myCol, 1 , 1) >= 'A'
AND SUBSTRING(myCol, 1 , 1) <= 'Z'
AND SUBSTRING(myCol, 2 , 1) >= 'A'
AND SUBSTRING(myCol, 2 , 1) <= 'Z'
AND SUBSTRING(myCol, 3 , 1) >= '0'
AND SUBSTRING(myCol, 3 , 1) <= '9'
【讨论】:
我认为 BETWEEN 非常适合您的解决方案。 这看起来很棒。认为最后应该是 ='9'。 这是我最终使用的。有时最简单的解决方案是最好的解决方案。非常感谢!【参考方案2】:嗯,是的,但它会非常缓慢且占用大量资源......
SELECT
myCol
FROM
myTable
WHERE
CHAR_LENGTH(myCol) = 3
AND SUBSTRING(myCol, 1, 1) IN ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')
AND SUBSTRING(myCol, 2, 1) IN ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')
AND SUBSTRING(myCol, 3, 1) IN ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'W', 'X', 'Y', 'Z')
这将匹配“12X”和“34Y”,但不匹配“123X”或“34YY”。
【讨论】:
“缓慢且耗费资源”是我的中间名 ;-) 这行得通。我知道这是一个非常混乱的妥协,但这只是我最终遇到的情况。谢谢。【参考方案3】:只是明确说明接受的答案:
SELECT myCol
FROM myTable
WHERE SUBSTRING(myCol, 1 , 1) BETWEEN 'A' AND 'Z' AND
SUBSTRING(myCol, 2 , 1) BETWEEN 'A' AND 'Z' AND
SUBSTRING(myCol, 3 , 1) BETWEEN '0' AND '9'
(Ken 的回答和 Andriy 的建议混合在一起)
【讨论】:
【参考方案4】:SELECT myCol
FROM myTable
WHERE ( myCol LIKE '12X%' OR myCol LIKE '34Y%' )
AND myCol NOT LIKE '34YY%'
粗略的示例,但应该可以帮助您解决问题。由于您的示例不那么精确,因此无法提供更多帮助。
【讨论】:
为了进一步帮助,% 是一个通配符,可以出现在字符串的前面和结尾,我认为也可以出现在两者之间,但我自己没有测试过,也没有 MySQL 连接方便立即尝试。所以 '%ABC%' 也可以。【参考方案5】:如果您的查询与您的示例一样简单(即没有参数),那么您可以使用存储过程使用 Reg Exp 返回结果吗?在这种情况下,驱动程序不应该知道或关心您正在使用 Reg Exp。
【讨论】:
我的实际查询有点复杂。但我认为存储过程仍然可以工作。谢谢【参考方案6】:试试这个 -
SELECT myCol FROM myTable WHERE myCol REGEXP '[[:alpha:]]2[[:digit:]]1'
http://dev.mysql.com/doc/refman/5.1/en/regexp.html
【讨论】:
供您参考:问题正文without using REGEXP
【参考方案7】:
如果您使用 EMS SQL Manager for MySQL,您可以使用 RegEx 过滤数据。
SELECT col
FROM tbl
WHERE col REGEXP '^[[:alpha:]]2[[:digit:]]1$'
正则表达式:
^[[:alpha:]]2[[:digit:]]1$
^
= 以
[[:alpha:]]
= 字母
[[:digit:]]
= 数字
n
= 正好 n 个实例
希望这会有所帮助。
【讨论】:
这个方法恐怕和我的 ADO.Net 驱动不兼容。上面的例子不会出错,但是每次都会返回 0 行。【参考方案8】:您可以使用 LIKE 测试前两位数字,第三位使用 ascii 范围。前两位数字也可以使用 ascii 范围,但 LIKE 应该更好。
select *
from tbl
where length(n) = 3
and '0123456789' like concat('%',mid(numcol,1,1),'%')
and '0123456789' like concat('%',mid(numcol,2,1),'%')
and ASCII(upper(MID(numcol,3,1))) between 65 and 90
【讨论】:
以上是关于不使用正则表达式的字母和数字排列的 SQL 匹配的主要内容,如果未能解决你的问题,请参考以下文章