Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL检测相同字符的序列?_Sql_Select_Sql Server 2008 R2_Where - Fatal编程技术网

SQL检测相同字符的序列?

SQL检测相同字符的序列?,sql,select,sql-server-2008-r2,where,Sql,Select,Sql Server 2008 R2,Where,我有一个表,其中填充了具有字符ID的项 示例: "TGHZN" "FVGHR" "OLTVD" "EERFV" -- invalid because of EE (sequence of the same character) "EFEDC" "DFFFB" -- invalid because of FFF 如何选择ID无效的所有行 无效ID由ID中的一系列相等字符(例如,AA)定义 我在正则表达式中尝试过,但没有成功:SELECT*来自ID为“%”(..\1+%”的项使用SQL Serve

我有一个表,其中填充了具有字符ID的项

示例

"TGHZN"
"FVGHR"
"OLTVD"
"EERFV" -- invalid because of EE (sequence of the same character)
"EFEDC"
"DFFFB" -- invalid because of FFF
如何选择ID无效的所有行

无效ID由ID中的一系列相等字符(例如,
AA
)定义


我在正则表达式中尝试过,但没有成功:
SELECT*来自ID为“%”(..\1+%”的项

使用SQL Server很难做到这一点,因为SQL Server不支持正则表达式(将“LIKE”的轻度增强称为“regular expressions”是严重的营销过度)

假设您的ID长度为5,您可以尝试以下方法:

where (id like '%' + substring(id, 1, 1) + substring(id, 1, 1) + '%') or
      (id like '%' + substring(id, 2, 1) + substring(id, 2, 1) + '%') or
      (id like '%' + substring(id, 3, 1) + substring(id, 3, 1) + '%') or
      (id like '%' + substring(id, 4, 1) + substring(id, 4, 1) + '%')
SQL Server不(开箱即用)支持正则表达式

实际上,
replicate()
函数将使逻辑更加清晰:

where (id like '%' + replicate(substring(id, 1, 1), 2) + '%') or
      (id like '%' + replicate(substring(id, 2, 1), 2) + '%') or
      (id like '%' + replicate(substring(id, 3, 1), 2) + '%') or
      (id like '%' + replicate(substring(id, 4, 1), 2) + '%')
另一个选项(ID长度不受限制)


从您编写的表达式中删除“+”。应采取以下措施:

SELECT * FROM Items WHERE ID LIKE '%(.)\1%'

此版本假定字符为ASCII大写字母。如果包含任何字母,它会变得有点麻烦。包括GordonLinoff国家的字符集。@你是正确的,我没有考虑国家字符集,但关于大写字母,只有当你的校对被设置为CS。一个简单的解决方案是将前26名改为前255名,并删除480k代表的64+Ok,我假设这是“最佳”解决方案。。。但是为什么我的正则表达式方法不可能呢?我觉得这应该管用somehow@GodofSourceSQL Server仅支持最小的类正则表达式。你不能使用它的全部功能。基本上类似于[0-9],使用%作为通配符,^表示否定或开始,以及其他一些事情,但您无法解决在其他语言中使用正则表达式所能解决的复杂问题@上帝之源。哦,那很简单。SQL Server不支持正则表达式。投票反对使用SQL Server中不存在的语法,并且没有进行最低限度的测试,例如,
select 1,其中'AAAAA'像'%(.)\1%
当'FOO'像'%(.)\1%'时选择CASE,然后选择1,否则0以ID结尾
返回
0
SELECT * FROM Items WHERE ID LIKE '%(.)\1%'