2012-01-20 74 views
8

Tôi có một thủ tục được lưu trữ sử dụng mệnh đề IN. Trong ứng dụng ASP.NET của tôi, tôi có một hộp văn bản nhiều dòng cung cấp các giá trị cho thủ tục được lưu trữ. Tôi muốn có thể đặt hàng bằng các giá trị khi chúng được nhập vào hộp văn bản. Tôi đã tìm ra cách làm điều này một cách dễ dàng trong mySQL (sử dụng hàm FIELD), nhưng không phải là một SQL Server tương đương.Đặt các kết quả SQL Server theo mệnh đề IN

Vì vậy, câu hỏi của tôi trông giống như:

Select * from myTable where item in @item 

Vì vậy, tôi sẽ được đi qua trong các giá trị từ ứng dụng của tôi như '113.113', '112.112', '114.114' (trong một trật tự tùy ý). Tôi muốn đặt hàng các kết quả theo danh sách đó.

Tuyên bố CASE có khả thi không? Tôi sẽ không biết có bao nhiêu mục đang đến trong dữ liệu hộp văn bản.

Trả lời

5

Bạn tham số như thế nào với mệnh đề IN?

Khi bạn đang sử dụng SQL Server 2008, tôi sẽ chuyển vào một số Table Valued Parameter với hai cột itemsort_order và tham gia vào đó thay thế. Sau đó, bạn chỉ có thể thêm một số ORDER BY sort_order vào cuối.

+2

+1 hoặc nếu bằng csv, được chia thành biến @table với cột nhận dạng mà bạn có thể tham gia và sau đó đặt hàng theo số –

+0

@KM nên OP cần viết thủ tục cửa hàng để chọn đơn giản –

+0

@LuisSiquot - Chúng đang sử dụng quy trình được lưu trữ. Nhưng họ nên sử dụng truy vấn được tham số ngay cả khi họ không truy vấn. Có rất nhiều chức năng chia bảng có giá trị xung quanh hoạt động như đề xuất của KM rằng OP có thể tham gia vào nhưng nếu khả năng tương thích 2005 không cần thiết, TVP sẽ tốt hơn. –

1

giống như cách bạn concatenate ('113.113', '112.112', '114.114') để vượt qua các câu sql trong nơi clausule bạn có thể nối

order by 
case item  
when '113113' then 1 
when '112112' then 2 
when '114114' then 3 
end 

để vượt qua để đặt hàng của bạn bằng cách clausule

+0

Không thể anh ta không biết có bao nhiêu giá trị sẽ có - câu lệnh trường hợp của bạn có thể từ 1 đến n trong đó n thực sự thực sự rất cao. – JonH

+0

@JonH có lẽ anh ta biết có bao nhiêu giá trị sẽ có. Tất nhiên giải pháp này là cho một trường hợp hữu hạn và "hợp lý" n. OP có thể đánh giá nếu một chút n phù hợp với nhu cầu của mình. Hãy chắc chắn rằng nếu điều này là cho một vấn đề trình bày n bao gồm tất cả các trường hợp hợp lý. –

+0

Tôi đồng ý với bạn tuy nhiên ông đã đề cập ông không biết bao nhiêu. Do đó nhận xét của tôi. – JonH

2

Từ nhận xét của KM ở trên ...

Tôi biết bạn không nói rằng nó được phân cách bằng dấu phẩy, nhưng nếu đó là CSV hoặc thậm chí nếu bạn có không gian riêng biệt, bạn có thể làm như sau.

DECLARE @SomeTest varchar(100) --used to hold your values 
SET @SomeTest = (SELECT '68,72,103') --just some test data 

SELECT 
    LoginID --change to your column names 
FROM 
    Login --change to your source table name 
INNER JOIN 
( SELECT 
    * 
    FROM fn_IntegerInList(@SomeTest) 
) n 
ON 
    n.InListID = Login.LoginID 
ORDER BY 
    n.SortOrder 

Và sau đó tạo fn_IntegerInList():

CREATE FUNCTION [dbo].[fn_IntegerInList] (@InListString ntext) 
RETURNS @tblINList TABLE (InListID int, SortOrder int) 
AS 
BEGIN 
declare @length int 
declare @startpos int 
declare @ctr int 
declare @val nvarchar(50) 
declare @subs nvarchar(50) 
declare @sort int 

set @sort=1 
set @startpos = 1 
set @ctr = 1 
select @length = datalength(@InListString) 

while (@ctr <= @length) 
begin 
    select @val = substring(@InListString,@ctr,1) 

    if @val = N',' 
    begin 
     select @subs = substring(@InListString,@startpos,@[email protected]) 
     insert into @tblINList values (@subs, @sort) 
     set @startpos = @ctr+1 
    end 
    if @ctr = @length 
     begin 
     select @subs = substring(@InListString,@startpos,@[email protected]) 
     insert into @tblINList values (@subs, @sort) 
     end 
    set @ctr = @ctr +1 
    set @sort = @sort + 1 
end 
RETURN 
END 

Bằng cách này chức năng của bạn tạo ra một bảng chứa một thứ tự sắp xếp cụ thể là, SortOrder và ID hoặc số bạn đang đi qua trong Bạn có thể dĩ nhiên sửa đổi này. để bạn đang tìm kiếm không gian thay vì giá trị ,. Nếu không, Martin có ý tưởng đúng trong câu trả lời của anh ta. Xin lưu ý trong ví dụ của tôi Tôi đang sử dụng một trong các bảng của tôi, vì vậy bạn sẽ cần thay đổi tên Login thành bất kỳ điều gì bạn đang xử lý.

+0

+1, quá lười/bận để tự trả lời ... –

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