是否可以为MySQL编写一个SQL语句,它可以查找与特定排列的字母/数字匹配的所有行而不使用REGEXP?
即。选择myCol FROM myTable WHERE myCol =' {number} {number} {letter} '
应该返回12X和34Y而不是123X或34YY
[我之前曾问过类似的问题 - ( SQL match on letter and number arrangement)。区别在于我发现我不能使用正在使用的ADO.Net驱动程序的正则表达式。更重要的是,我无法更新它,因为我使用的Visual Studio 2003与以后的版本不兼容。]
答案 0 :(得分:1)
嗯,是的,但这将是非常缓慢和资源密集的......
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”。
答案 1 :(得分: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'
答案 2 :(得分:1)
明确说明接受的答案:
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的建议的混合物)
答案 3 :(得分:0)
SELECT myCol
FROM myTable
WHERE ( myCol LIKE '12X%' OR myCol LIKE '34Y%' )
AND myCol NOT LIKE '34YY%'
粗略的例子,但应该帮助你解决问题。因为你的例子并不精确,所以无法提供帮助。
答案 4 :(得分:0)
如果您的查询与示例一样简单(即没有参数),那么您可以使用存储过程使用Reg Exp返回结果吗?在这种情况下,驾驶员不应该知道或关心您正在使用Reg Exp。
答案 5 :(得分:0)
试试这个 -
SELECT myCol FROM myTable WHERE myCol REGEXP '[[:alpha:]]{2}[[:digit:]]{1}'
答案 6 :(得分:0)
如果您使用的是EMS SQL Manager for MySQL,则可以使用RegEx过滤数据。
SELECT col
FROM tbl
WHERE col REGEXP '^[[:alpha:]]{2}[[:digit:]]{1}$'
正则表达式:
^[[:alpha:]]{2}[[:digit:]]{1}$
^
=以
[[:alpha:]]
=字母
[[:digit:]]
=数字
{n}
=正好是
希望这有帮助。
答案 7 :(得分:0)
您可以使用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