2011-02-09 14 views
11

Có cách nào để đặt ký tự không in hoặc không gây khó chịu ở đầu chuỗi dữ liệu trong sqlserver hay không. để khi một yêu cầu bằng được thực hiện, chuỗi được sắp xếp sau chữ z theo thứ tự bảng chữ cái?Có cách nào để đặt một ký tự vô hình ở đầu chuỗi để thay đổi thứ tự sắp xếp của nó không?

Tôi đã sử dụng dấu cách ở đầu chuỗi để lấy chuỗi ở đầu danh sách được sắp xếp, nhưng tôi đang tìm cách làm một thứ tương tự như đặt chuỗi ở cuối danh sách.

Tôi không muốn đặt trường khác như "SortOrder" trong bảng để sử dụng để sắp xếp thứ tự và tôi không muốn sắp xếp danh sách trong mã của mình.

Added: Vâng, tôi biết đây là một ý tưởng tồi, nhờ vào tất cả đề cập đến nó, nhưng vẫn còn, tôi tò mò nếu những gì tôi yêu cầu có thể được thực hiện

+0

Sắp xếp trên chuỗi? Tôi không rõ về những gì bạn đang hình dung –

+0

@OMG Ngựa con Dưới đây là các giá trị chuỗi mẫu: một, hai, * bốn *, ba, táo. Tôi muốn chúng được phân loại như táo, một, ba, hai, và * bốn *. –

+0

Tôi nhận được phần sắp xếp, tôi không hiểu cách bạn dự định giao tiếp để phân loại. Làm thế nào để bạn biết "bốn" là cuối cùng? –

Trả lời

8

Kể từ khi không ai mạo hiểm để trả lời câu hỏi của bạn đúng cách, đây là câu trả lời của tôi

Given: Bạn đã thêm <space> một số dữ liệu khác để làm cho chúng xuất hiện trên

Giải pháp: Thêm CHAR (160) để làm cho nó xuất hiện ở phía dưới. Điều này trong thực tế cũng là một không gian, nhưng được thiết kế cho các hệ thống máy tính để không đối xử với nó như là một từ vỡ (do đó tên).

http://en.wikipedia.org/wiki/Non-breaking_space

yêu cầu của bạn:

  1. Nếu không có thêm lĩnh vực khác như "SortOrder" vào bảng
  2. Nếu không sắp xếp danh sách trong mã của bạn

Tôi nghĩ rằng phù hợp này !

create table my(id int,data varchar(100)) 
insert my 
select 1,'Banana' union all 
select 2,Char(160) + 'mustappearlast' union all 
select 3,' ' +N'mustappearfirst' union all 
select 4,'apple' union all 
select 5,'pear' 

select * 
from my 
order by ASCII(lower(data)), data 

(ok tôi lừa dối, tôi đã có thêm ASCII(lower( nhưng điều này là gần gũi nhất với yêu cầu của bạn hơn tất cả các câu trả lời khác cho đến nay)

2

Bạn nên sử dụng cột khác trong cơ sở dữ liệu để giúp xác định thứ tự chứ không phải là sửa đổi chuỗi:

SELECT * 
FROM yourtable 
ORDER BY sortorder, yourstring 

đâu bạn dữ liệu có thể trông như thế này:

yourstring    sortorder 
foo      0 
bar      0 
baz      1 
qux      1 
quux      2 

Nếu bạn không thể sửa đổi các bảng bạn có thể có thể đặt cột SortOrder vào một bảng khác nhau và tham gia giải quyết:

SELECT * 
FROM yourtable AS T1 
JOIN yourtablesorting AS T2 
ON T1.id = T2.T1_id 
ORDER BY T2.sortorder, T1.yourstring 

giải pháp thay thế:

Nếu bạn thực sự không thể sửa đổi cơ sở dữ liệu ở tất cả, thậm chí không thêm một bảng mới rồi bạn có thể thêm bất kỳ ký tự mà bạn thích vào lúc bắt đầu của chuỗi và loại bỏ nó trong chọn:

SELECT RIGHT(yourstring, LEN(yourstring) - 1) 
FROM yourtable 
ORDER BY yourstring 
+0

@ Mark Tôi nghĩ đó là giải pháp tốt nhất nhưng OP đặc biệt nói 'Tôi không muốn đặt một trường khác như "SortOrder" trong bảng để sử dụng để sắp xếp thứ tự,' – Skilldrick

+0

+1 Mặc dù các yêu cầu đã nêu của OP, Tôi vẫn nghĩ đây là con đường để đi. –

+0

@Skilldrick: Điểm công bằng! Tôi đã không đọc được điều đó ... Tuy nhiên tôi vẫn khuyên bạn nên làm điều này. Nếu bảng không thể sửa đổi có lẽ cột có thể nằm trong một bảng khác ... –

1

thể bạn bạn bao gồm một cái gì đó như:

"<SORT1>This is my string" 
"<SORT2>I'd like this to go second" 

Và xóa chúng sau? Tôi nghĩ rằng việc sử dụng các nhân vật vô hình là dễ vỡ và dễ bị tấn công.

+0

Tôi không muốn phải chỉnh sửa mã này trong mã của tôi. –

+0

+1 vì đây là một ý tưởng hay. Sửa đổi nhỏ: nó có thể được thực hiện trong cùng một câu lệnh SQL. –

0

Theo tôi, một nhân vật vô hình cho mục đích này là một ý tưởng tồi vì nó gây ô nhiễm dữ liệu. Tôi sẽ làm chính xác những gì bạn không muốn làm và thêm một cột mới.

Để sửa đổi ý tưởng một chút, bạn có thể thực hiện nó không theo thứ tự sắp xếp, nhưng thứ tự nhóm, mặc định là 0, trong đó số nguyên âm đặt nhóm ở đầu danh sách và số nguyên dương ở dưới cùng và sau đó "order by sort_priority, foo"

+0

tất nhiên, đây là những gì đánh dấu mô tả, nhưng ông nhấn bài trước tôi! – horatio

1

Bạn có thể đặt thứ tự sắp xếp trong truy vấn và sử dụng công đoàn (không đảm bảo về hiệu suất).

select 1 as SortOrder, * 
from table 
where ... --first tier 
union 
select 2, * 
from table 
where ... --second tier 
order by SortOrder 
+0

Đây là gần nhất với những gì tôi đang tìm kiếm cho đến nay. –

0

Tôi với mọi người khác cách lý tưởng để làm điều này là thêm cột bổ sung cho thứ tự sắp xếp.

Nhưng nếu bạn không muốn thêm cột khác và bạn đã sử dụng khoảng trống cho những mục bạn muốn xuất hiện ở đầu danh sách, bạn cảm thấy thế nào khi sử dụng đường ống (|) cho các mục tại dưới cùng của danh sách?

By default, SQL Server sử dụng bộ ký tự Unicode để sắp xếp. Trong Unicode, đường ống và cả hai dấu ngoặc nhọn ({,}) xuất hiện sau z, vì vậy, bất kỳ ký tự nào trong ba ký tự đó cũng phù hợp với bạn.

+1

Bắt đầu với những ký tự đặc biệt đã di chuyển chuỗi đó lên trên cùng của sắp xếp. –

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