2008-09-30 40 views
5

Tôi cần thêm khả năng cho người dùng phần mềm của tôi chọn các bản ghi theo phạm vi ký tự.
Làm cách nào để viết truy vấn trả về tất cả các tiện ích con từ một bảng có tên nằm trong phạm vi Ba-Bi chẳng hạn?Cách tốt nhất để chọn trường chuỗi dựa trên phạm vi ký tự là gì?

Hiện nay tôi đang sử dụng lớn hơn và ít hơn các nhà khai thác, vì vậy ví dụ trên sẽ trở thành:

select * from widget 
where name >= 'ba' and name < 'bj' 

Chú ý cách tôi đã "tăng lên" ký tự cuối cùng của giới hạn trên từ i tới j để "xe đạp" sẽ không bị bỏ quên.

Có cách nào chung để tìm ký tự tiếp theo sau một ký tự cụ thể dựa trên đối chiếu trường hay có an toàn hơn để tạo điều kiện thứ hai không?

select * from widget 
where name >= 'ba' 
and (name < 'bi' or name like 'bi%') 

Ứng dụng của tôi cần hỗ trợ bản địa hóa. Độ nhạy của loại truy vấn này đến các bộ ký tự khác nhau như thế nào?

Tôi cũng cần hỗ trợ cả MSSQL và Oracle. Các tùy chọn của tôi để đảm bảo rằng vỏ ký tự bị bỏ qua bất kể ngôn ngữ xuất hiện trong dữ liệu là gì?

Trả lời

3

Hãy bỏ qua trực tiếp đến nội địa hóa. Bạn có nói "aa"> = "ba" không? Có lẽ không, nhưng đó là nơi nó sắp xếp ở Thụy Điển. Ngoài ra, bạn chỉ đơn giản là không thể giả định rằng bạn có thể bỏ qua vỏ bọc trong bất kỳ ngôn ngữ nào. Vỏ bọc rõ ràng là phụ thuộc vào ngôn ngữ, với ví dụ phổ biến nhất là tiếng Thổ Nhĩ Kỳ: chữ hoa i là İ. Chữ thường tôi là ı.

Bây giờ, DB SQL của bạn xác định kết quả của <, == vv theo "thứ tự đối chiếu". Điều này chắc chắn là ngôn ngữ cụ thể.Vì vậy, bạn nên kiểm soát rõ ràng điều này, cho mọi truy vấn. Một thứ tự đối chiếu Thổ Nhĩ Kỳ sẽ đặt những cái tôi ở nơi họ thuộc về (bằng tiếng Thổ Nhĩ Kỳ). Bạn không thể dựa vào đối chiếu mặc định.

Đối với "phần gia tăng", đừng bận tâm. Chấm vào> = và < =.

0

phiền, các Hàm substring của Oracle là SUBSTR(), trong khi đó SQL Server là SUBSTRING().

Bạn có thể viết một trình bao bọc đơn giản xung quanh một hoặc cả hai để chúng chia sẻ cùng một tên hàm + nguyên mẫu.

Sau đó, bạn chỉ có thể sử dụng

MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi' 

hoặc tương đương.

0

Bạn có thể sử dụng này ...

select * from widget 
where name Like 'b[a-i]%' 

này sẽ phù hợp bất kỳ hàng nơi tên bắt đầu bằng b, nhân vật thứ hai là trong khoảng một đến tôi, và bất kỳ nhân vật khác làm theo.

+0

Tôi tin rằng, ít nhất là trong MySQL, đó sẽ là "thích", không phải "như". – pilsetnieks

+0

Điều gì sẽ xảy ra nếu người dùng chọn phạm vi Ba-Ci hoặc thậm chí là Abc-Def? –

0

Tôi nghĩ rằng tôi muốn đi với một cái gì đó đơn giản như thêm một chuỗi phân loại cao vào cuối của giới hạn trên. Một cái gì đó như:

select * from widgetwhere name >= 'ba' and name <= 'bi'||'~' 

Tôi không chắc rằng sẽ tồn tại chuyển đổi EBCDIC dù

0

Bạn cũng có thể làm điều đó như thế này:

select * from widget 
where left(name, 2) between 'ba' and 'bi' 

Nếu thay đổi tiêu chí của bạn dài (như bạn dường như chỉ trong một chú thích bạn trái), truy vấn sẽ cần phải có độ dài như một đầu vào thêm:

declare @CriteriaLength int 
set @CriteriaLength = 4 
select * from widget 
where left(name, @CriteriaLength) between 'baaa' and 'bike' 
Các vấn đề liên quan