TableA和ColumnA在一起。ColumnA是包含以下值的VARCHAR:
#1002#15#
#1002#16#
#1003#17#
#1003#17#16#
#1004#18#
#1004#18#3#
#1004#18#3#1155#我需要在ColumnA,.e.g中找到重复的数字:
#1002#15#1002#
#1004#18#3#1004#
#1003#17#17#我尝试了许多类似的模式,如下所述:https://technet.microsoft.com/en-us/library/ms187489(v=sql.105).aspx
到目前为止没有效果,主要是因为那些重复的数字可以是2-5个字符长。
发布于 2016-05-10 08:23:40
由于在您的情况下不可能使数据库正常化,所以您需要一种不同的方法。
一种选择是将CROSS APPLY用于串分裂函数,它将获取列的内容并将其拆分为行,从而使您能够查询列的内容。
在这个演示中,我从Aaron的文章中选择了SplitStrings_XML:
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现在,创建并填充示例表:
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#')使查询非常简单的:
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)结果:
id ColumnA
----------- -----------------
8 #1002#15#1002#
9 #1004#18#3#1004#
10 #1003#17#17#https://stackoverflow.com/questions/37132498
复制相似问题