2009-07-17 42 views
5

Tôi đã tạo một bảng. Trong một trường, tôi có mức độ ưu tiên của bản ghi đó (từ 1-9). Tôi đã không đặt mức độ ưu tiên cho tất cả các bản ghi, vì vậy đối với một số bản ghi, nó sẽ giữ nguyên.Có thể sử dụng cả hai đơn hàng theo và trong một truy vấn đơn lẻ

Khi hiển thị các bản ghi này trong trang HTML, tôi chỉ kiểm tra những ưu tiên đó - nếu ưu tiên tồn tại, thì tôi sẽ hiển thị như vậy, nếu nó rỗng, thì tôi sẽ hiển thị nó là ưu tiên thấp nhất của '10' (chỉ để hiển thị).

Sự cố xảy ra khi sắp xếp bảng. Nếu tôi cố gắng để sort(DESC) bảng, nó sẽ hiển thị 10 trong hàng đầu tiên và sau đó tiếp tục hoàn hảo (1,2, ....).

Cách giải quyết vấn đề này?

Có thể hiển thị các ưu tiên trước và sau đó tiếp tục với các giá trị null không?

+0

bạn có thể cung cấp các truy vấn SQL đầy đủ bạn sử dụng? –

+0

chọn mức độ ưu tiên từ thứ tự priortable theo mức độ ưu tiên desc – praveenjayapal

Trả lời

2

Có một số cách để giải quyết.

1/Thay đổi dữ liệu để 10 thực sự là trong bảng (chứ không phải là NULL):

update table TBL set FLD = 10 where FLD is null; 

2/Sửa đổi truy vấn của bạn để trở về giá trị khác nhau cho NULL:

select FLD1, FLD2, case where FLD3 is null then 10 else FLD3 end from ... 

3/Tạo chế độ xem để thực hiện tùy chọn 2 ở trên tự động.

Tôi muốn chọn tùy chọn 1 vì nó có khả năng là hiệu quả nhất.

SQL không chỉ định cách thức sắp xếp NULL (mặc dù tôi nghĩ rằng nó chỉ định chúng liền kề) - điều đó có nghĩa là chúng có thể ở đầu hoặc cuối (hoặc có thể ở giữa mặc dù tôi chưa bao giờ thấy điều đó xảy ra).

Lý do tôi đưa ra khía cạnh hiệu quả là các hàm trên mỗi hàng không mở rộng tốt. Khi bảng được lớn hơn, bạn sẽ thấy rằng chuyển đổi NULL thành 10 mỗi khi bạn chọn sẽ rất tốn kém.

Tốt hơn là nên cắn viên đạn và chỉ đặt chúng thành 10 trong cơ sở dữ liệu. Điều này sẽ cho phép DBMS tối ưu hóa các truy vấn tốt hơn. Và, nếu bạn cần sử dụng 10 cho một mức độ ưu tiên thực sự khác, chỉ cần thay đổi tất cả 10 giây hiện tại thành 11 (hoặc 9999) trước khi bạn bắt đầu.

4

Đây là một mẫu ngắn cho thấy làm thế nào để chuyển đổi NULL thành một giá trị và sau đó sắp xếp trên nó ..

create table test 
(
    priority int null, 
    detail varchar(10) 
) 

insert into test values (1, 'one') 
insert into test values (3, 'three') 
insert into test values (8, 'eight') 
insert into test values (9, 'nine') 
insert into test values (null, 'ten') 

select ISNULL(priority, 10), detail from test order by ISNULL(priority, 10) 

Điều quan trọng là ISNULL'ing trường giá trị null'able để chuyển đổi NULL để giá trị (10) mà bạn muốn.

+0

Điều này là tốt cho các bảng nhỏ hơn, chỉ cần lưu ý các chức năng của mỗi hàng không được chia tỷ lệ tốt. – paxdiablo

+1

Trong ý nghĩa tốt nhất có thể, "rác" - Tôi đã làm việc trên một hệ thống mà đã có null trong các bảng lớn hơn đáng kể và dài hơn đáng kể (c.5 triệu bản ghi) và hiệu suất đã đầy đủ hơn (bao gồm dữ liệu được sử dụng trong các truy vấn nối phức tạp). Đó là với Sql Server 2000, tôi tưởng tượng 2k5/2k8 sẽ là tốt, nếu không tốt hơn. MySql mặt khác - tốt, nó không tốt, vì vậy ai biết ;-) – Rob

+0

Tôi vừa thực hiện một điểm chuẩn vi mô trên bảng này (2 cột, 655k hàng, 20% với ưu tiên là null, chia tách bằng 80% giữa [1,3,8,9}) và hơn 4 lần thực hiện của mỗi lần, không có sự khác biệt đáng kể về hiệu suất. – Rob

1

Nếu bạn muốn hồ sơ ưu tiên NULL xuất hiện cuối cùng, tôi muốn giới thiệu cái gì đó như

ORDER BY (IFNULL (ưu tiên, 1000000)) hoặc một cái gì đó như thế này

+1

Người dùng cuối cùng sẽ chèn bản ghi với mức ưu tiên 1000001. Tôi sẽ làm điều đó với 'ORDER BY CASE KHI ƯU TIÊN LÀ NULL THEN 1 ELSE 0 END, Priority' chỉ để chắc chắn. – wqw

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