2016-03-30 27 views
0

から来る複数のLIKEパターンに対しては、例えば、これを含んでいますマッチ私はサフィックス(TLDの)私はに興味を持つ一つのテーブルを持っている別のクエリ

'.co.uk' 
'.de' 
'.fr' 

私もURLで別のテーブルを持っています。最初のテーブルに基づいて、私はパターンのいずれかに一致する第二のテーブルからすべてのレコードを取得する:

'%.co.uk/%.asp' 
'%.de/%.asp' 
'%.fr/%.asp' 

この場合、一般的なパターンは'%.<TLD>/%.asp'です。

どうすればいいですか?今、私は、最初のテーブルに基づいて一連のORを生成し、生成されたクエリを実行する一時的なプログラムを使用しています。 TLDテーブルが変更されるたびに結果のクエリが膨大になり、プログラムを再実行する必要があるため、私はそれに満足していません。

+0

私はこれを正しく理解していますか?自分のTLDや「%.asp」に適合するすべてのURLをフィルタリングしたいですか? – Shnugo

+0

いいえ、スラッシュはURLの区切り文字なので、私は 'www.website.de/login.asp'のような結果を探しています。 – Emmit

+0

ああ、OK ...動的SQLは可能ですか? – Shnugo

答えて

1

このようなものはありますか?

また、ORのリストを生成していますが、これは動的に行われているため、TLDリストを変更した後に外部生成や再生成する必要はありません。 RegExについて考えるかもしれませんが、長いリストもあります。

一つの拡張は(RIGHT 4文字と速い).aspで終わるすべてのレコードを取得するために最初のフィルタを使用することで、その後

CREATE TABLE #TLDs(TLD VARCHAR(10)); 
INSERT INTO #TLDs VALUES('.co.uk'),('.de'),('.fr'); 

CREATE TABLE #URLs(URL VARCHAR(200)); 
INSERT INTO #URLs VALUES 
('http://www.test1.de') 
,('http://www.test2.de/login.asp') 
,('http://www.test3.fr/login.other') 
,('http://www.test4.co.uk/login.asp') 
,('http://www.test5.com') 
,('http://www.test6.tv') 
,('http://www.test7.asp/login.asp'); 

DECLARE @filter VARCHAR(MAX)= 
STUFF 
(
    (
     SELECT 'OR URL LIKE ''%' + TLD + '/%.asp'' ' 
     FROM #TLDs 
     FOR XML PATH('') 
    ),1,3,'' 
) 

DECLARE @cmd VARCHAR(MAX)= 
'SELECT * FROM #URLs AS u WHERE ' + @filter; 

EXEC (@cmd); 

DROP TABLE #URLs; 
DROP TABLE #TLDs; 

結果...唯一のあなたのTLDのためのパターンの検索を行うことができ

http://www.test2.de/login.asp 
http://www.test4.co.uk/login.asp 
+0

ニース、これはトリックです!それは150以上の非常に遅いですが、それは私の心配ではありません。 – Emmit

+0

@Emmitこれを読んでうれしい!フィルタリングを2つのステップで実行しようとしました: 'WHERE RIGHT(URL、4)= '。asp' AND(... or list ...)'?この場合、ORリストを '/%'の下に作成します。 – Shnugo

関連する問題