2016-05-10 24 views
1

私はTableAにColumnAを持っています。 ColumnAのような値が含まれていVARCHARである:ここで説明するように私はLIKEパターンの数を試してみましたSQLクエリの正規表現

#1002#15#1002# 
#1004#18#3#1004# 
#1003#17#17# 

#1002#15# 
#1002#16# 
#1003#17# 
#1003#17#16# 
#1004#18# 
#1004#18#3# 
#1004#18#3#1155# 

は私がColumnA中の数字を繰り返し見つける必要があり、.eg https://technet.microsoft.com/en-us/library/ms187489(v=sql.105).aspx

これまでのところ、数字の繰り返しは2〜5文字の長さになる可能性があるためです。

+1

Sqlサーバーは、CRL機能以外の正規表現をサポートしていません。データベースを正常化し、その列Aを表に変更するのではなく、[区切りのデータを単一の列に保持する]。(http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a実際にはデータベースの列) –

+0

ugh。ありがとうございました。問題は、私はテーブルの構造を所有していないので、私はそこにあるものをクエリする必要があります...構造を変更することはできません。 hm。したがって、本質的にSQLサーバーでそれを行う良い方法はないと言っています。おそらく私は別のテーブルにそれをダンプすることができます。それは、そこにdup数値を見つける一回の運動だからです。 – SGM

+0

あなたは、iTVFスプリッタ機能を使うことができます。詳細を参照してくださいhttp://www.sqlservercentral.com/articles/Tally+Table/72993/ CREATE権限がない場合は、cte – Serg

答えて

4

データベースあなたの場合は不可能ですが、別のアプローチが必要です。
1つのオプションは、string splitting functionCROSS APPLYを使用して、列の内容を取り出して行に分割して、列の内容を照会できるようにすることです。クエリが非常に簡単になり

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#') 

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 

は、サンプルテーブルを作成し、移入:私はアーロンの記事からSplitStrings_XML選択したこのデモのために

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# 
+0

がうまく動作するように、それを使用してください。 – SGM

+0

喜んで:-) –