2014-10-29 33 views
6

Tôi muốn tìm lời khuyên của bạn cho dù bất kỳ chức năng nào trong máy chủ SQL cho phép tôi thực hiện khớp một phần cho danh sách giá trị?TSQL - So khớp một phần bằng cách sử dụng LIKE cho nhiều giá trị

Toàn bộ chuỗi cần được đối sánh sẽ được chuyển qua thủ tục lưu trữ.

Tôi đang cố gắng tìm giải pháp thay thế khác trước khi viết chức năng của riêng mình để chia chuỗi bằng dấu phẩy và sau đó kết hợp tất cả kết quả trước khi trả lại dữ liệu cho chương trình.

Ví dụ, tôi sẽ vượt qua trong chuỗi sau vào TSQL tôi

táo, cam, lê

tại khoản WHERE của tôi nó phải phù hợp

select * from store where fruits like 'apple%' 
select * from store where fruits like 'orange%' 
select * from store where fruits like 'pear%' 

Tôi có thể đạt được các kết quả trên trong một câu lệnh SQL chứ không phải là viết hàm để phá vỡ mỗi chuỗi?

dữ liệu trong bảng của tôi

apple red 
apple green 
orange sweet 
orange sour 
pear big 
pear small 

Vì vậy, khi tôi đi ngang qua trong chuỗi "quả táo, quả lê", tôi cần phải trả lại

apple red 
apple green 
pear big 
pear small 
+2

'Trái cây 'trông như thế nào? Đừng nói giá trị được phân tách bằng dấu phẩy. Đó là một thiết kế rất, rất nghèo cho một cơ sở dữ liệu quan hệ. –

+0

Tôi chỉ sử dụng một bảng đơn giản để minh họa. – user3015739

+0

Bạn có vấn đề cơ bản với cấu trúc dữ liệu của mình. Bạn không nên lưu trữ danh sách những thứ như chuỗi. Thay vào đó, bạn nên sử dụng bảng nối. –

Trả lời

1

Hãy thử điều này, nhưng hiệu suất sẽ không được tuyệt vời

declare @parm varchar(200) 
set @parm = ','+'apple,orange,pear'+',' 

select * from store where charindex(fruit,@parm) > 0 
+0

Nó không hoạt động vì bạn không thể có táo, cam trong cùng một dữ liệu. Tôi chỉ sử dụng mô hình phù hợp để tìm tất cả táo đỏ, táo xanh, cam lớn, cam nhỏ. – user3015739

+0

Xin lỗi, nhập - Tôi đã đảo ngược các tham số.Hãy thử phiên bản đã thay đổi – Sparky

1

Có thể đơn giản như:

SELECT 
    * 
FROM 
    store 
WHERE 
    fruits LIKE 'apple%' 
    OR fruits LIKE 'orange%' 
    OR fruits LIKE 'pear%' 
+0

Chuỗi sẽ được chuyển vào từ quy trình lưu trữ và tôi cần trả lại tập dữ liệu bằng cách sử dụng đối sánh mẫu. Tôi không có vấn đề bằng văn bản một chức năng để tách chuỗi và sau đó kết hợp các kết quả. Chỉ cần cố gắng khám phá những tùy chọn khác mà tôi có. – user3015739

+1

Tôi thích các giải pháp đơn giản –

7

Bạn có thể tạo một bảng temp như

'CREATE TABLE #Pattern (
     SearchItems VARCHAR(20) 
    );' 

Lưu ý phụ: Đảm bảo bạn kiểm tra xem bảng tạm thời có tồn tại để tránh lỗi hay không. Bây giờ bạn có thể chèn các từ tìm kiếm của bạn vào bảng temp như

'INSERT 
    INTO #Pattern 
    VALUES 
     ('% APPLE %'), 
     ('% ORANGE %'), 
     ('% BANANA %');' 

Bây giờ sử dụng bảng tạm thời này, tìm kiếm bảng của bạn sử dụng một INNER JOIN như

'SELECT * 
FROM Store 
INNER JOIN #Pattern 
    ON Store.Fruits LIKE SearchItems 
' 

Là một lưu ý, Bàn Temp là một cái gì đó Tôi cố gắng tránh chủ yếu, nhưng ở đây nó có ích, và trường hợp tôi đã sử dụng giải pháp này không đòi hỏi hiệu suất. Thay vào đó nó làm cho nó dễ dàng hơn để giữ cho các tìm kiếm ngày càng tăng.

Hy vọng điều này cũng phù hợp với người khác.

-1

Có một cách để làm điều đó trong SQL, nhưng nó khá phức tạp. Giả sử bạn có thể sống bằng cách kết hợp một chuỗi lên đến, ví dụ, ba tên trái cây, bạn tiến hành theo cách sau.

Chúng tôi giả định rằng @fruits là biến varchar chứa danh sách các loại trái cây, mà chúng tôi nối thêm delimiters dấu phẩy (trong trường hợp nó chứa ít hơn ba tên trái):

declare @fruits varchar(80); 
set @fruits = <list of fruits passed in> + ',_,_,_,'; 

Các phương trình sau đây không SQL , nhưng toán học đằng sau các hoạt động chuỗi con chúng tôi sẽ cần cho like biểu:

NOTE: NOT SQL 

First fruit word: 
p1 = charindex(',', @fruits)   << position of ',' delimiter 
v1 = substring(@fruits, 0, p1-1) + '%' << fruit word we seek 
r1 = substring(@fruits, p1+1)   << remainder of string 

Second fruit word:  
p2 = charindex(',', r1) 
v2 = substring(r1, 0, p2-1) + '%' 
r2 = substring(r1, p2+1) 

Third fruit word: 
p3 = charindex(',', r2) 
v3 = substring(r2, 0, p3-1) + '%' 
r3 = substring(r2, p3+1) 

...and so on... 

Bây giờ chúng ta thay thế các giá trị đầu tiên của p1, v1r1 vào tập hợp phương trình thứ hai cho p2, v2r2. Và tương tự như vậy, chúng tôi thay thế tập hợp giá trị thứ hai đó thành tập thứ ba, v.v. Chúng tôi kết thúc với những sinh vật quái dị cho v1, v2, và v3:

v1 = substring(@fruits, 0, charindex(',', @fruits)-1) + '%' 
v2 = substring(substring(@fruits, charindex(',', @fruits)+1), 0, charindex(',', substring(@fruits, charindex(',', @fruits)+1))-1) + '%' 
v3 = substring(substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1), 0, charindex(',', substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1))-1) + '%' 

Đây là ba LIKE giá trị đầu tiên chúng ta cần phải tìm kiếm:

select * from fruits 
where fruit like <v1> 
    or fruit like <v2> 
    or fruit like <v3> 

mở rộng đầy đủ, truy vấn là:

select * from fruits 
where fruit like substring(@fruits, 0, charindex(',', @fruits)-1) + '%' 
    or fruit like substring(substring(@fruits, charindex(',', @fruits)+1), 0, charindex(',', substring(@fruits, charindex(',', @fruits)+1))-1) + '%' 
    or fruit like substring(substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1), 0, charindex(',', substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1))-1) + '%' 

Chúng tôi có thể làm nhiều việc hơn để trích xuất từ ​​thứ 4, từ thứ 5, từ thứ 6, v.v. theo như chúng tôi muốn. Nhưng mỗi giá trị vN tiếp tục phức tạp hơn nhiều so với trước đó.

Lưu ý: Tôi chưa thử giải pháp này, tôi chỉ chứng minh nó bằng toán học.

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