2010-07-15 13 views
7

Regular İfadeyi bir İşlev (MSSQL) içine LIKE'ya dönüştürmenin iyi bir yolu var mı? sproc bundan daha karmaşık almaz:Sql RegEx için Beğen

(country\=)(?<Country>[\w\d]+)(\&sessionid\=)(?<SessionId>.+) 

grupları GİBİ içinde kullanılmayacak, başka bir amaç için vardır.

ben gibi geç bir sproc içinde bu kullanmak istiyorum: regex [Tablo]

+1

Neyi başarmaya çalışıyorsunuz? Kuralların normal ifadeler olarak ifade edildiği bir çeşit masa tabanlı gönderme mekanizması? ... Doğru tahmin edersem merak ediyorum. –

+0

Günlük dosyalarını ayrıştırmayı düşünürdüm. Bu bir sorgu dizgisine benziyor. –

+0

Tomek doğru :) – Andreas

cevap

4

Bir CLR işlevi kullanarak SQL sunucusuna Normal İfade ayrıştırması eklemek mümkündür. Bu, SQL 2005 ve üstü ile mümkündür. Mükemmel bir örnek için here'a bakın. Her bir satırdaki dize sütununu ayrıştırarak, büyük bir tabloda çok yavaş çalışacak

+0

Sonunda onlardan bir cevap aldım, iyi çalışmalı .. Teşekkürler. Ve cevabınız soruyu tam olarak cevaplamıyor olsa da, bu benim problemimi çözmüyor .. Ben de bunu çözülmüş olarak işaretledim :) – Andreas

+1

Bu bağlantı soruyu yanıtlayabilirken, cevabın temel parçalarını buraya eklemek ve sunmak referans için bağlantı. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir – Moes

3

kontrol edin sql bu fonksiyon bir parçasıdır

SELECT * FROM [Table] 
WHERE test_regex(regex, 'text') = 1 

. Bu görevi başarmak için yardımcı olabilir: PATINDEX('%[^0-9\.]%',@Input)

PATINDEX (Transact-SQL)

+0

Bir ifadenin regex: s "+" veya "*" gibi birden çok örneğinin işlevini anlatmanın bir yolu var mı? Örneğin PATINDEX ('% [a-c] +%', @ Giriş) – Andreas

+0

hayır bunu düşünmüyorum –

1

Değil kutunun dışında. SQL Server'da normal ifadeye en yakın olanı PATINDEX'tir(), ancak bu normal ifadeler yapmaz.

Eğer bunu gerçekten istiyorsanız, bunun yerine normal ifadeyi çalıştırmak için bir CLR işlevi yapmanız gerekir. Hızla ilgili endişeleriniz olabilir, ancak normal ifadeleri veya kalıpları ilgilendiren hemen hemen hiç bir şeyin bir indeksi kullanabileceğini söyleyeceğim.

2

.

Tabloyu değiştirebilirseniz, bu dize sütununu farklı sütunlara bölmek daha iyi olabilir, böylece daha geleneksel bir WHERE country=... AND sessionid=... olabilir, bu şekilde bir dizin ekleyebilir ve kullanabilirsiniz.

4

Ben

SELECT ... 
FROM [Table] 
WHERE col LIKE 'country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%' 

yeterince yakın olabilir hayal olur? Amaç sadece boş olmayan ülke ve oturum değeri ile kayıtları geri getirmekse.

Sütundaki değer mutlaka 'country' ile başlamıyorsa, KM'nin yanıtına göre önemli sorunları yavaşlatacak olan WHERE col LIKE '%country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%''u kullanmanız gerekir.

1

Serbest olan SQL# içinde RegEx işlevini kullanın. Bu yaklaşımla herhangi bir performans sorunum olmadı.