2010-02-19 20 views
11

Xin chào, tôi cần trợ giúp để hiểu phần giải mã của truy vấn giống như sau.ORDER BY DECODE (BLAH, [COLUMN NUMBER]) trên một truy vấn cột đơn. Làm thế nào nó hoạt động?

SELECT ax.animal_code  
FROM raw_animal_xref ax, 
     animal_xref_type axt 
WHERE ax.animal_mnemonic = l_animal_mnemonic -- Example 'COUGAR' 
AND ax.animal_code_type = axt.animal_code_type 
ORDER BY DECODE (animal_type, 
       l_type_to_be_matched, -1, -- Example 'CATS' 
       l_current_type, 0, -- Example 'BIG CATS' 
       nvl(axt.type_search_priority, 100)) ASC; -- EXAMPLE 'Big Cats' Priority is 1 

Vì truy vấn này chỉ trả về 1 truy vấn, tôi hơi bối rối về cách ORDER BY hoạt động với các số cột không tồn tại khác nhau do DECODE cung cấp. Truy vấn hoạt động như một con trỏ để tìm một mã duy nhất cho con vật được đề cập cho một động vật ghi nhớ loại động vật hiện tại và loại được so khớp với. Tôi nghĩ rằng DECODE trả về các số cột khác nhau để ORDER BY với và tôi đã thử nghiệm với một cột đơn giản khác nhau chọn trên một số bảng khác với ORDER bởi '-1', '0' và '100' và ORDER bởi dường như thất bại cho 0 và 100. Tại sao nó hoạt động với -1 hoặc bất kỳ số nào khác?

Hy vọng ai đó có thể giải thích điều này với tôi. Cảm ơn!

Trả lời

4

Nó tạo tập hợp sẽ được sử dụng để đặt hàng.

Nếu animal_type = l_type_to_be_matched, sử dụng một -1 là giá trị sắp xếp cho rằng hàng
else if animal_type = l_current_type, sử dụng 0 như giá trị loại hàng đó
else if axt.type_search_priority là null sau đó sử dụng 100 như giá trị sắp xếp của hàng đó
khác sử dụng axt.type_search_priority làm giá trị sắp xếp cho hàng đó.

Nó cung cấp một loại cirteria sắp xếp có điều kiện. Thường được sử dụng để đảm bảo rằng một số mặt hàng luôn ở trên cùng hoặc dưới cùng của một tập hợp được sắp xếp.

+1

Cảm ơn bạn đã trả lời! Vì vậy, nó có nghĩa là nếu hàng hiện tại là một COUGAR IE BIG CAT, nó sẽ được thiết lập là 0 mà sẽ luôn luôn đặt nó trong hàng thứ 2 trở đi và khi tôi gặp phải một "Mèo trong nước" hàng IE "CAT" loại nó sẽ được thiết lập như -1 IE nó sẽ được trên đầu trang của thiết lập của tôi. Và nếu tôi đang trên một hàng mà không có bất kỳ search_priority, nó sẽ được ở dưới cùng của danh sách IE 100. Là sự hiểu biết của tôi đúng? – Azeworai

+0

có, đó là ý tưởng. Dưới đây là một bài đăng khác mô tả việc thực hiện tương tự: http://www.orindasoft.com/public/blog/2007/07/oracles-decode-funtion.html –

5

ORDER BY có thể sử dụng một trong ba biểu thức. Trước hết là bí danh của danh sách lựa chọn, thứ hai là số cột trong danh sách lựa chọn hoặc thứ ba là biểu thức SQL có thể sử dụng 0 hoặc nhiều cột từ bảng nguồn.

Vì vậy, khi bạn sử dụng ORDER BY SUBSTR (col, 2,10) bạn đặt hàng bằng chuỗi con 10 ký tự của giá trị cột bắt đầu từ ký tự thứ hai.

Tương tự như vậy khi sử dụng

ORDER BY decode(col,'DOG',1,'CAT',2,'EEL', 3, 5) 

bạn dịch 'CAT' vào giá trị 1, DOG vào giá trị 2 và EEL vào giá trị 3, sau đó theo thứ tự của các giá trị số kết quả (tức là DOG đầu tiên, sau đó CAT , sau đó EEL, cuối cùng là bất cứ điều gì khác).

Bạn có thể đạt được thứ tự tương tự sử dụng

ORDER BY decode(col,'DOG','A','CAT','B','EEL', 'C', 'D') 
1

Đề cập đến phần này của câu hỏi của bạn:

Tôi đang nghĩ đến giải mã mà trả về số cột khác nhau để ORDER BY với và Tôi đã thử nghiệm một cột đơn giản khác nhau chọn trên một số bảng khác với ORDER theo số '-1', '0' và '100' và ORDER theo dường như không thành công cho 0 và 100. Tại sao nó hoạt động với -1 hoặc bất kỳ số nào khác trong số ?

Sự nhầm lẫn của bạn là dễ hiểu; nhưng không, các giá trị trả về bởi DECODE không được hiểu là số cột.

Oracle hỗ trợ một cú pháp cú pháp nhỏ, trong đó các cột của tập kết quả có thể được tham chiếu một cách có vị trí trong mệnh đề ORDER BY. Vì vậy, trong ví dụ này:

SELECT a, b FROM some_table ORDER BY 1,2 

là giống như:

SELECT a, b FROM some_table ORDER BY a,b 

Tuy nhiên, ký hiệu vị trí này chỉ có thể được thực hiện với các chữ số nguyên không âm. Nếu ORDER BY bao gồm một biểu thức trong đó tạo ra một giá trị số, nó sẽ không được hiểu là một số cột, nhưng như là một giá trị thực tế được sắp xếp trên. Ngoài ra, các số nguyên âm được hiểu là giá trị sắp xếp, không phải là số cột.

SELECT * FROM table ORDER BY -1 sẽ sắp xếp tất cả các hàng trên giá trị hằng số -1 (không phân loại hiệu quả).

SELECT * FROM table ORDER BY 0 sẽ trả về lỗi vì 0 là số cột không hợp lệ.

SELECT * FROM table ORDER BY 1 sẽ sắp xếp tất cả các hàng trên giá trị của cột đầu tiên trong bảng.

SELECT * FROM table ORDER BY 100 sẽ sắp xếp tất cả các hàng trên giá trị của cột thứ 100 trong bảng hoặc trả lại lỗi nếu có ít hơn 100 cột.

SELECT * FROM table ORDER BY TO_NUMBER('1') sẽ sắp xếp tất cả các hàng trên giá trị không đổi 1.

tôi đã không kiểm tra này ra triệt để, nhưng nhìn vào một số kế hoạch thực hiện, có vẻ như bạn thậm chí có thể chỉ định một tổ chức phi nguyên số chữ, và nó sẽ được làm tròn và được sử dụng như một số cột.

SELECT * FROM table ORDER BY 1.5 dường như sắp xếp theo giá trị của cột đầu tiên.

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