2010-07-15 38 views
7

Có cách nào tốt để chuyển đổi Cụm từ thông dụng thành NHƯ bên trong một hàm (MSSQL) không? Các sproc không trở nên phức tạp hơn này:Sql Giống như RegEx

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

Các nhóm sẽ không được sử dụng trong LIKE, họ đang có cho mục đích khác.

Tôi muốn sử dụng này bên trong một sproc cuối như:

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

đâu regex là một phần của [Bảng]

+1

Bạn đang cố gắng làm gì? Một số loại cơ chế công văn dựa trên bảng nơi các quy tắc được thể hiện dưới dạng biểu thức chính quy? ... Chỉ cần tò mò nếu tôi đoán chính xác. –

+0

Tôi sẽ giả định phân tích tệp nhật ký. Trông giống như một chuỗi truy vấn. –

+0

Tomek là chính xác :) – Andreas

Trả lời

4

Có thể thêm phân tích cụm từ thông dụng vào máy chủ SQL, sử dụng hàm CLR. Điều này có thể từ SQL 2005 trở lên. Xem here để có ví dụ tuyệt vời.

+0

Cuối cùng có một câu trả lời từ họ, nên làm việc tốt .. Cảm ơn. Và mặc dù câu trả lời của bạn không hoàn toàn trả lời câu hỏi của tôi, nó giải quyết vấn đề của tôi .. Vì vậy, tôi đánh dấu nó là đã được giải quyết :) – Andreas

+1

Trong khi liên kết này có thể trả lời câu hỏi, tốt nhất là đưa các phần quan trọng của câu trả lời vào đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi – Moes

3

Kiểm tra chức năng này của sql. Nó có thể giúp bạn đạt được nhiệm vụ của bạn: PATINDEX('%[^0-9\.]%',@Input)

PATINDEX (Transact-SQL)

+0

Có cách nào để báo cho hàm biết rằng nhiều phiên bản của một biểu thức, như regex: s "+" hoặc "*". Ví dụ PATINDEX ('% [a-c] +%', @ Đầu vào) – Andreas

+0

không, tôi không nghĩ rằng nó có thể –

1

Không ra khỏi hộp. Gần nhất bạn nhận được một tìm kiếm regex trong SQL Server là PATINDEX(), nhưng điều đó không làm biểu thức chính quy.

Nếu bạn thực sự muốn điều này, bạn phải tạo hàm CLR để chạy regex thay thế. Bạn có thể lo ngại về tốc độ, nhưng tôi sẽ nói rằng hầu như không có gì bạn sẽ làm mà mối quan tâm thường xuyên biểu hiện hoặc các mẫu sẽ có thể sử dụng một chỉ mục anyway.

2

sẽ chạy rất chậm trên một bảng lớn, phân tích cú pháp cột chuỗi trên mỗi hàng.

nếu bạn có thể thay đổi bảng, có thể tốt hơn để tách cột chuỗi đó thành các cột khác nhau, vì vậy bạn có thể có WHERE country=... AND sessionid=... truyền thống hơn, thậm chí bạn có thể thêm và sử dụng chỉ mục theo cách này.

4

Tôi muốn tưởng tượng

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

có thể là đủ gần? Nếu mục đích là chỉ để mang lại hồ sơ với các quốc gia không trống và các giá trị sessionid.

Nếu giá trị trong cột không nhất thiết phải bắt đầu bằng 'quốc gia', bạn phải sử dụng WHERE col LIKE '%country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%', điều này có thể làm chậm đáng kể số lượng theo câu trả lời của KM.

1

Sử dụng chức năng RegEx trong phạm vi SQL# miễn phí. Tôi đã không có bất kỳ vấn đề hiệu suất với phương pháp này.

Các vấn đề liên quan