首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询正则表达式

SQL查询正则表达式
EN

Stack Overflow用户
提问于 2016-05-10 07:59:36
回答 1查看 55关注 0票数 1

TableA和ColumnA在一起。ColumnA是包含以下值的VARCHAR:

代码语言:javascript
复制
#1002#15#
#1002#16#
#1003#17#
#1003#17#16#
#1004#18#
#1004#18#3#
#1004#18#3#1155#

我需要在ColumnA,.e.g中找到重复的数字:

代码语言:javascript
复制
#1002#15#1002#
#1004#18#3#1004#
#1003#17#17#

我尝试了许多类似的模式,如下所述:https://technet.microsoft.com/en-us/library/ms187489(v=sql.105).aspx

到目前为止没有效果,主要是因为那些重复的数字可以是2-5个字符长。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-10 08:23:40

由于在您的情况下不可能使数据库正常化,所以您需要一种不同的方法。

一种选择是将CROSS APPLY用于串分裂函数,它将获取列的内容并将其拆分为行,从而使您能够查询列的内容。

在这个演示中,我从Aaron的文章中选择了SplitStrings_XML

代码语言:javascript
复制
CREATE FUNCTION dbo.SplitStrings_XML
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@List, @Delimiter, '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   );
GO

现在,创建并填充示例表:

代码语言:javascript
复制
DECLARE @TableA as table
(
    id int identity(1,1),
    ColumnA varchar(100)
)

INSERT INTO @TableA VALUES
('#1002#15#'),
('#1002#16#'),
('#1003#17#'),
('#1003#17#16#'),
('#1004#18#'),
('#1004#18#3#'),
('#1004#18#3#1155#'),
('#1002#15#1002#'),
('#1004#18#3#1004#'),
('#1003#17#17#')

使查询非常简单的

代码语言:javascript
复制
SELECT id, ColumnA
FROM @TableA 
CROSS APPLY dbo.SplitStrings_XML(ColumnA, '#')
WHERE Item IS NOT NULL
GROUP BY id, ColumnA
HAVING COUNT(Item) > COUNT(DISTINCT Item)

结果:

代码语言:javascript
复制
id          ColumnA
----------- -----------------
8           #1002#15#1002#
9           #1004#18#3#1004#
10          #1003#17#17#
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37132498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档