2009-01-13 26 views
6

Nếu tôi có một danh sách các mục, nóiCách tốt nhất để kiểm tra xem danh sách các mục có tồn tại trong cột cơ sở dữ liệu SQL không?

apples 
pairs 
pomegranites 

và tôi muốn xác định bất kỳ mà không tồn tại trong cột 'quả' trong một bảng SQL DB.

  • Hiệu suất nhanh là mối quan tâm chính.
  • Cần phải di chuyển qua các triển khai SQL khác nhau.
  • Danh sách đầu vào có thể chứa số lượng mục nhập tùy ý.

Tôi có thể nghĩ ra một số cách để làm điều đó, tôi nghĩ rằng tôi sẽ ném nó ra khỏi đó và xem những gì bạn nghĩ.

+0

Ồ, và tôi không quan tâm thứ tự các mặt hàng trong bảng, nó chỉ là cho dù mỗi mục tồn tại. – Brabster

Trả lời

12

Kể từ khi danh sách các loại trái cây bạn chọn từ có thể tùy tiện lâu, tôi xin đề nghị như sau:

create table FruitList (FruitName char(30)) 
insert into FruitList values ('apples'), ('pears'), ('oranges') 

select * from FruitList left outer join AllFruits on AllFruits.fruit = FruitList.FruitName 
where AllFruits.fruit is null 

Một trái bên ngoài tham gia nên nhanh hơn nhiều so với "không" hoặc loại khác của các truy vấn.

+0

+1 nhưng FWIW bạn cần mỗi tuple được ngoặc đơn riêng: VALUES ('táo'), ('lê'), (' cam '), ... –

+0

Cảm ơn @Bill. Tôi không sử dụng nhiều VALUES, nên đã kiểm tra tham chiếu của tôi trước. Đã sửa. – Kluge

+0

Có lẽ là lựa chọn tốt nhất. nếu bạn không muốn tạo một bảng, bạn có thể tạo một biến bảng để làm điều tương tự và nó sẽ bị hủy khi truy vấn của bạn kết thúc. – scottm

1
if exists(select top 1 name from fruit where name in ('apples', 'pairs', 'pomegranates')) 
    PRINT 'one exists' 
+0

Điều đó chỉ nói rằng một loại trái cây tồn tại, không phải là danh sách các loại trái cây KHÔNG tồn tại. –

+0

Tôi không nhìn thấy nơi anh ta nói rằng anh ta cần phần còn lại của các loại trái cây trong bảng, chỉ có hay không một trong những điều này không tồn tại. – scottm

+0

Xin lỗi, tôi cần phải xác định các loại trái cây có trong danh sách của tôi nhưng không tồn tại trong bảng. – Brabster

3

Đặt danh sách tìm kiếm thành chuỗi có dạng '| fruit1 | fruit2 | ... fruitn |' và đặt mệnh đề where của bạn:

where 
    @FruitListString not like '%|' + fruit + '|%' 

Hoặc phân tích chuỗi đã nói trên thành bảng hoặc bảng tạm thời và làm where not in (select fruit from temptable). Tùy thuộc vào số lượng mục bạn đang tìm kiếm và số lượng mục được tìm kiếm, phương pháp này có thể nhanh hơn.

+0

+1 cho giải pháp sáng tạo của Joel Spolsky! http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause#337817 –

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