2011-12-12 23 views
5

kẻ hi tôi đã truy vấn sau đây trong sqlsql nhận được thông tin, nhưng để sai

SELECT 
a1 
FROM 
dbo.myProductNames 
WHERE 
keycode = 40 OR keycode = 28 OR keycode = 32 OR keycode = 50 

a1 = tên tôi cần những thông tin trong bảng để đầu ra tên của nó truy vấn trong ive trật tự hỏi , vì vậy tôi cần 40 để được đầu tiên sau đó 28 như vậy trên.

Lý do là mã của tôi đọc kết quả và lưu trữ trong một mảng mà sau đó được sử dụng để hiển thị trên biểu mẫu.

Bảng rằng các truy vấn SQL đến từ có các thông tin được lưu trữ theo thứ tự num, vì vậy 28 sẽ được đọc đầu tiên vv vv

Như tôi đã nói rằng tôi cần phải nhận được các thông tin theo thứ tự tôi bước vào trong mệnh đề where.

Tôi đang suy nghĩ điều gì đó cần làm với câu lệnh Chọn lồng nhau mặc dù ive chưa bao giờ thử chọn lồng nhau.

Hoặc, có cách nào dễ dàng không?

Mọi trợ giúp sẽ tuyệt vời!

Rất cám ơn trước!

!!!!! UPDATE !!!!!

ok đây là giải pháp cảm ơn các bạn!

SqlCommand pgNameFill = new SqlCommand("SELECT a1, CASE keycode WHEN @pg1 THEN 1 WHEN @pg2 THEN 2 WHEN @pg3 THEN 3 WHEN @pg4 THEN 4 END AS SortOrder FROM dbo.myProductNames WHERE keycode IN (@pg1, @pg2, @pg3, @pg4) ORDER BY SortOrder ASC", conny1); 

     pgNameFill.Parameters.AddWithValue("@pg1", pg1); 
     pgNameFill.Parameters.AddWithValue("@pg2", pg2); 
     pgNameFill.Parameters.AddWithValue("@pg3", pg3); 
     pgNameFill.Parameters.AddWithValue("@pg4", pg4); 
     SqlDataReader readpg = pgNameFill.ExecuteReader(); 

Rất cảm ơn tất cả các bài đăng! tôi ước tôi có thể gắn cờ nhiều câu trả lời hơn chỉ là một, ồ ạt, tất cả đều tốt đẹp!

+2

Bằng cách này bạn cũng có thể sử dụng WHERE keycode IN (40,28,32,50) và bạn dường như đang tìm kiếm một loại ORDER BY? – Ruben

+0

Dựa trên một vài nhận xét mà bạn đã thực hiện, bạn tuyên bố rằng điều này sẽ được tham số. Nó sẽ được rằng bạn có một số cố định các thông số nguyên? Hay bạn cần một giải pháp chấp nhận 'bất kỳ số nào' của các tham số, và vẫn duy trì thứ tự? Sau đó, nó sẽ là sql động (xây dựng một chuỗi sql để thực thi, với các tham số được tham chiếu trong chuỗi đó), hoặc một thủ tục lưu sẵn? Ngoài ra, phiên bản của SQL này là gì? – MatBailie

+0

ah có, nó sẽ luôn luôn là 4 params, im sử dụng MSSQL trên một máy chủ 2008.và tôi sẽ sử dụng lựa chọn trong một chuỗi gắn liền với mã của tôi trong C# – lemunk

Trả lời

5

Thêm ORDER BY khoản sau:

ORDER BY 
CASE keycode 
    when 40 then 1 
    when 28 then 2 
    when 32 then 3 
    when 50 then 4 
END 
+0

cập nhật bài đăng của tôi – lemunk

+0

huyền thoại! hoạt động tốt! – lemunk

4

Bạn cần sử dụng từ khóa ORDER BY. Trừ khi một lệnh được chỉ định trong truy vấn không có sự bảo đảm trong đó thứ tự cơ sở dữ liệu sẽ trả về các bản ghi. Thứ tự các bản ghi trong bảng sẽ không nhất thiết phải là thứ tự các bản ghi trong các kết quả truy vấn.

Nếu thứ tự bạn yêu cầu không đúng số hoặc chữ cái, bạn có thể cần phải thêm cột SortOrder bổ sung vào bảng của bạn để bạn có thể sử dụng để sắp xếp như mong muốn.

+2

nhưng theo thứ tự? anh ta muốn đặt hàng bằng mã khóa, chứ không phải ASC hoặc DESC nhưng theo một cách cụ thể cho mỗi truy vấn (nếu tôi hiểu chính xác). – Flo

+0

tôi đồng ý và thông thường đây sẽ là nỗ lực đầu tiên của tôi trong việc giải quyết vấn đề nhỏ này. Nhưng thứ tự là thứ mà người dùng mong muốn vì vậy có thể không có trật tự, đó là vấn đề lớn nhất tôi có – lemunk

+0

chính xác phải là flo, như tôi đã nói đây là vấn đề gây phiền nhiễu do người dùng hehe, nếu tôi có cách tôi sẽ sắp xếp thông tin ASC hoặc DESC và sẽ không có probs! – lemunk

5

Một cách (giả sử mssql từ lịch sử của bạn);

;with myRank(rank, keycode) as (
    select 1, 40 union 
    select 2, 28 union 
    select 3, 32 union 
    select 4, 50 
) 
select 
    a1 
from 
    myProductNames 
    inner join myRank on (myProductNames.keycode = myRank.keycode) 
order by 
    myRank.rank asc 
+0

trông thú vị, có một điều khác mặc dù nhìn vào những gì bạn đã làm, giá trị của tôi sẽ là thông số được truyền vì vậy nó sẽ là keycode = @ pg1. là ok để vượt qua các thông số như thế này hay nó phải được thực hiện khác nhau? – lemunk

+0

Nó phụ thuộc vào những gì chính xác là biến, bạn có thể sử dụng các biến trong cte như trong 'select 1, @ 1stparam_with_top_rank union ...' –

+0

Cá nhân tôi sẽ tránh khó mã hóa loại logic này vào truy vấn. Điều gì sẽ xảy ra khi cần thay đổi? Có thể là một nhức đầu bảo trì. – Simon

2

Thêm vào câu trả lời của Simon. Tôi sẽ thay đổi truy vấn để gì đó như:

SELECT 
a1, 
CASE keycode WHEN 40 THEN 1 
WHEN 28 THEN 2 
WHEN 32 THEN 3 
WHEN 50 THEN 4 END AS SortOrder 
FROM dbo.myProductNames 
WHERE keycode IN (40, 28, 32, 50) 
ORDER BY SortOrder ASC 
+0

nhưng câu hỏi của tôi để hồi phục là những gì về các thông số. Trong mã của tôi người dùng chọn một "pg" (nhóm sản phẩm) có thể là 40 vv. Sau đó, nó được chuyển thành tham số trong một trình đọc sql trong mã C# của tôi như thế này "WHERE keycode = @ pg1 OR keycode = @ pg2 .. ..etc ". Chỉ có lý do tôi hỏi là vì nếu tôi nhớ luôn có một số hạn chế khi sử dụng các tham số. – lemunk

+0

Hay tôi đang suy nghĩ? – lemunk

+0

cập nhật bài viết của tôi – lemunk

1
SELECT a1 
FROM myProductNames 
ORDER BY CASE WHEN keycode =40 THEN 1 
       WHEN keycode =28 THEN 2 
       WHEN keycode =32 THEN 3 
       WHEN keycode =50 THEN 4 
       ELSE 5 
       END; 
+0

đã cập nhật bài đăng của tôi – lemunk

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