2016-03-30 85 views
0

gelen birden GİBİ desenleri karşı Örneğin, bu içerir:Maç ben soneklerinin (TLD) İlgilendiğim ile bir tablo var başka bir sorgu

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

Ben de URL'ler ile başka bir tablo var. İlk tabloda dayanarak, desen herhangi biriyle eşleşen ikinci tablodan tüm kayıtları almak istiyorum:

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

bu durumda genel desen '%.<TLD>/%.asp' olduğunu.

Bunu nasıl yaparım? Şu anda ilk tabloyu temel alan bir dizi ORS üreten bir derme çatma programı kullanıyorum ve oluşturulan sorguyu çalıştırıyorum. Bundan memnun değilim çünkü sonuçta oluşan sorgu çok büyük ve program TLD tablosunun her değiştiğinde yeniden çalıştırılması gerekiyor.

+0

Bunu doğru anlıyor musunuz: TLD'lerinizden herhangi birine uyan tüm URL'leri veya "% .asp" 'i filtrelemek mi istiyorsunuz? – Shnugo

+0

Hayır, eğik çizgi, url'deki ayırıcıdır, bu yüzden www.website.de/login.asp' gibi sonuçları arıyorum. – Emmit

+0

Ah, Tamam ... Dinamik SQL mümkün mü? – Shnugo

cevap

1

Böyle bir şey mi var?

Ayrıca, OR'lerin bir listesini oluşturuyor, ancak bunu dinamik olarak yapıyor, bu nedenle TLD'ler listenizde değişiklik yapıldıktan sonra harici bir nesle ve yeniden üretime gerek yoktur. RegEx'i düşünebilirsin, ama sende uzun bir listenin var.

Bir iyileştirme (RIGHT 4 karakterlerle hızlı) .asp ile biten tüm kayıtları almak için bir ilk filtre kullanmak için olabilir ve daha sonra

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; 

sonuç ... sadece TLD'leri için desen arama yapabileceği

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

Güzel, bu hile yok! 150'den fazla tld ile oldukça yavaş, ama bu benim için bir endişe değil. – Emmit

+0

@Emmit Bunu okumak için sevindim! Filtreyi iki adımda yapmaya çalıştınız: 'NEREDE (URL, 4) = '. Asp' VE (... veya liste ...)'? Bu durumda OR listesini sadece /% 'ye indirirsiniz ... – Shnugo