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
, v1
và r1
vào tập hợp phương trình thứ hai cho p2
, v2
và r2
. 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.
'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ệ. –
Tôi chỉ sử dụng một bảng đơn giản để minh họa. – user3015739
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. –