2
文字でソートし、次に数値でソートする必要があるアルファ数値の列値を扱っています。データのSQL英数字VARCHAR列の並べ替え
例:
- A1
- A10
- A11
- 次のように210
をソートする必要があります
- A1
- A1A
- A1B
- A2
- A3
- AB1
- AB2 AB
- ...
SQLでこれを並べ替える方法についてのアドバイスが必要です。
ありがとうございました。
文字でソートし、次に数値でソートする必要があるアルファ数値の列値を扱っています。データのSQL英数字VARCHAR列の並べ替え
例:
をソートする必要があります
SQLでこれを並べ替える方法についてのアドバイスが必要です。
ありがとうございました。
試しましたか?
SELECT column_x
FROM table_name x
ORDER BY x.column_name ASC|DESC, x.column_name ASC|DESC;
英数字は以下のとおりです。ただし、英数字以外の値については動作が定義されていないことに注意してください。
WITH A (A, N) AS (
SELECT A, 3 + LEN(A) FROM (
SELECT 'a1'
UNION ALL
SELECT 'a10'
UNION ALL
SELECT 'a11'
UNION ALL
SELECT 'ab2'
UNION ALL
SELECT 'ab21'
UNION ALL
SELECT 'ab22'
UNION ALL
SELECT 'a1a'
UNION ALL
SELECT 'a1b'
UNION ALL
SELECT 'a1'
UNION ALL
SELECT 'a1a'
UNION ALL
SELECT 'a1b'
UNION ALL
SELECT 'a2'
UNION ALL
SELECT 'a3'
UNION ALL
SELECT 'a9'
UNION ALL
SELECT 'ab1'
UNION ALL
SELECT 'ab2'
UNION ALL
SELECT 'ab3'
) T (A)
), B (A, N, I, C, D, X) AS (
SELECT A, N, 3, CAST(SUBSTRING(A, 1, 1) AS VARCHAR(255)), CAST(SUBSTRING(A, 2, 1) AS VARCHAR(255)), CAST('' AS VARCHAR(255)) FROM A
UNION ALL
SELECT A, N, I + 1, D, CAST(SUBSTRING(A, I, 1) AS VARCHAR(255)), CASE WHEN ASCII(C) BETWEEN 48 AND 57 AND ASCII(D) BETWEEN 48 AND 57 THEN CAST(X + CHAR(10 + ASCII(D)) AS VARCHAR(255)) WHEN 58 > ASCII(C) THEN CAST(X + C AS VARCHAR(255)) ELSE CAST(X + CHAR(3 + ASCII(C)) AS VARCHAR(255)) END FROM B WHERE I <= N
)
SELECT A FROM B WHERE I = N
ORDER BY X COLLATE Latin1_General_BIN
コードは、現在ケースセンシティブな方法でソートするが、
ORDER BY UPPER(X) COLLATE Latin1_General_BIN
又は
ORDER BY LOWER(X) COLLATE Latin1_General_BIN
を使用することにより、例えば、同様に大文字と小文字を区別しないソートを実行するために微調整することができるされています文字列の形式は一貫してまた、使用されているdbmsは何ですか? –
数字の部分の前には1〜3文字が付いています。 – AlexVPerl
ご使用のデータベースに質問にタグを付けてください。 –