Mam bazę danych z kolumną VARCHAR, która zawiera liczby całkowite o różnej długości. Chcę je posortować, aby 10 pojawiło się po 9, a nie 1, a 70A po 70. Mogłem to zrobić za pomocą instrukcji PATINDEX () , CTE i CASE w klauzuli WHERE.
Zastanawiałem się jednak, czy istnieje zestawienie, w którym byłoby to zbędne.
sql-server
collation
sorting
natural-sort
Justin Dearing
źródło
źródło
Odpowiedzi:
Nie. Sortowanie dotyczy sortowania alfabetycznego, w zależności od strony kodowej, akcentu, wielkości liter, szerokości i kana. Znaki liczbowe (0–9) nie mają żadnych właściwości.
Tak
9
jest zawsze po10B
w dowolnym rodzaju.Musisz to podzielić, jak zauważyłeś,
lub posortować w następujący sposób:Długość po prawej określa, ile masz spacji.Możesz oczywiście:
just just in a char (zapisana wersja mojego PRAWA powyżej)Te ostatnie 2 sugestie są jak moje PRAWO powyżej i nieco inne. Szybsze sortowanie (nie wymaga przetwarzania colukmn), ale wymagane jest więcej pamięci
źródło
9
jest zawsze10B
w jakimkolwiek rodzaju ”: jest to tylko w SQL Server, ponieważ podstawowa opcja sortowania do obsługi „DigitsAsNumbers” nie została ujawniona jako opcja sortowania. Jeszcze ;-). Stało się to dostępne dla aplikacji opartych na systemie Windows, począwszy od systemu Windows 7, w szczególności w Eksploratorze plików. I pewnego dnia może zostać narażony na działanie programu SQL Server, jeśli wystarczająca liczba osób poprze ten pomysł. Próbowałem sprawić, by piłka się potoczyła, wypełniając następującą sugestię Connect: Obsługa „naturalnego sortowania” / DIGITSASNUMBERS jako opcji sortowania .Chciałbym Skonfiguruj obliczane kolumny następnie rodzaj na podstawie tego. Coś jak
Następnie użyj tej kolumny, aby posortować według, ponieważ możesz teraz indeksować kolumnę.
źródło
Jeśli potrzebujesz bolesnego sposobu na udowodnienie, co mówi @gbn (zasadniczo, że nie możesz powiedzieć sortowaniu, aby inaczej zamawiało podciągi), możesz utworzyć szybką tabelę #temp, która ma współczynnik dla oczekiwanej kolejności, i sprawdzić, czy zamawianie według dowolnego zestawienia zwraca to samo zamówienie:
Działa to dla mnie za około 10 sekund i daje 0 wierszy - co oznacza, że żadne sortowanie niedostępne dla SQL Server (przynajmniej 2008 R2, nie próbowałem Denali) posortuje w sposób zgodny z oczekiwaniami. Potrzebujesz innego sposobu zdefiniowania sortowania.
źródło
Chcesz rozsądnego i wydajnego sposobu sortowania liczb w ciągach jako liczb rzeczywistych? Rozważ głosowanie na moją sugestię Microsoft Connect: Obsługa „naturalnego sortowania” / DIGITSASNUMBERS jako opcji sortowania
Chociaż to pytanie jest specyficzne dla programu SQL Server, a ta odpowiedź nie jest, uważam, że nadal powinienem publikować te informacje, aby zwiększyć ich świadomość i nie sprzeciwiać się żadnej z pozostałych odpowiedzi.
Biorąc to pod uwagę, poza SQL Server, w niektórych środowiskach możliwe jest sortowanie tego typu. Jest to coś, co jest przynajmniej określone w dokumentacji Unicode. W JĘZYKU MARKUPU DANYCH UNICODE LOCALE (LDML) CZĘŚĆ 5: Standard / raport COLLATION znajduje się tabela ustawień sortowania, która opisuje różne opcje dostosowywania sortowania. Jedną z opcji jest
-kn-true
lub[numericOrdering on]
:Jednak ten dokument jest „standardem technicznym” i nie jest częścią podstawowej specyfikacji Unicode. Uwaga na górze dokumentu brzmi:
Dlatego to szczególne zachowanie nie jest dostępne w SQL Server, a nawet w .NET (przynajmniej nie natywnie), mimo że oba są zgodne z podstawową specyfikacją Unicode.
Projekt ICU (International Components for Unicode) to zestaw bibliotek C / C ++ i Java, które implementują tę funkcjonalność, a jest nawet demo online. A w „powiązanych projektach” znajduje się link do projektu .NET, który wydaje się być opakowaniem obiektów COM dla biblioteki ICU, który pozwoliłby na ujawnienie tej funkcji w zarządzanym kodzie. Ale nie jest jasne, czy ten projekt .NET jest nadal aktywny.
Ale aby zobaczyć to zachowanie w akcji, przejdź do demonstracji ICU Collation .
Wklej następujące elementy w polu Tekst wejściowy po lewej stronie:
Ustaw wszystkie opcje na „domyślne”. Zaznacz opcję „wprowadź numery linii” po prawej stronie sortprzycisku i upewnij się, że opcja „siły różnic” nie jest zaznaczona.
Kliknij sortprzycisk i powinieneś uzyskać następujące informacje:
Tego należy się spodziewać podczas typowego sortowania ciągów i tego, co widzisz w SQL Server.
Teraz, w serii przycisków radiowych tuż nad sortprzyciskiem, drugi rząd jest oznaczony jako „numeryczny”. Wybierz przycisk radiowy „on”.
Kliknij sortprzycisk ponownie i powinieneś uzyskać następujące informacje:
Pytanie, czy to działa, gdy część liczbowa znajduje się w środku ciągu? Ok, wklej następujące elementy w polu Tekst wejściowy po lewej stronie (zastępując poprzednią listę):
Upewnij się, że ustawienie numeryczne jest nadal ustawione na „włączone”. Kliknij sortprzycisk ponownie i powinieneś uzyskać następujące informacje:
Chcesz to zobaczyć w innym miejscu? Utwórz folder na dysku twardym, na przykład C: \ temp \ sorting \ , i utwórz puste pliki o tych samych nazwach „Skrypt -...”. Wykonaj
DIR
polecenie w oknie poleceń, a zobaczysz standardowe sortowanie. Ale patrząc na listę plików w Eksploratorze Windows zobaczysz listę posortowaną za pomocą opcji „numerycznej” :-).źródło