ORDER BY 字母数字排序
ORDER BY Alphanumeric sort
我想按以下顺序对数据进行排序:
- 数-数
- 字母数字
- Alpha 没有破折号
我有以下排序:
- 120-1
- 120-2
- 120-10
- 数字 1
- 数字 10
- 数字 2
- 婚礼
这是我要查找的顺序,除了数字(带破折号的字母)条目未按破折号后的数字排序。
经过多次尝试,这是我目前的 sql 声明:
SELECT SessionID, Identifier FROM Session
ORDER BY
CASE
WHEN CAST(Identifier AS INTEGER) THEN SUBSTR(Identifier,0, INSTR(Identifier, '-')) + CAST(SUBSTR(Identifier, INSTR(Identifier, '-')+1, 999) AS INTEGER)
ELSE Identifier END
我做错了什么?
谢谢。
您的逻辑是以某种方式重构字符串,但是对于 order by
,您需要这样的东西:
order by (case when CAST(Identifier AS INTEGER) <> 0 then 1
when Identifier like '%-%' then 2
else 3
end),
identifier
注意:这假设数字永远不会 0
。
1) 按包含 -
的字符串排序,因此它们首先出现
2) 按包含 -
的字符串中 -
之前的第一部分排序,在适用的情况下将它们转换为整数,否则按列本身排序
3) 在包含 -
的字符串中按 -
之后的第二部分排序,在适用的情况下将它们转换为整数,否则按列本身排序
select val
from t
order by
case when val like '%-%' then 1 else 2 end
,case when substr(val,1,instr(val,'-')-1) glob '*[0-9]*'
then cast(substr(val,1,instr(val,'-')-1) as integer)
when substr(val,1,instr(val,'-')-1) glob '*[a-zA-Z]*'
then substr(val,1,instr(val,'-')-1)
else val end
,case when val like '%-%' then cast(substr(val,instr(val,'-')+1) as integer)
else val end
我想按以下顺序对数据进行排序:
- 数-数
- 字母数字
- Alpha 没有破折号
我有以下排序:
- 120-1
- 120-2
- 120-10
- 数字 1
- 数字 10
- 数字 2
- 婚礼
这是我要查找的顺序,除了数字(带破折号的字母)条目未按破折号后的数字排序。
经过多次尝试,这是我目前的 sql 声明:
SELECT SessionID, Identifier FROM Session
ORDER BY
CASE
WHEN CAST(Identifier AS INTEGER) THEN SUBSTR(Identifier,0, INSTR(Identifier, '-')) + CAST(SUBSTR(Identifier, INSTR(Identifier, '-')+1, 999) AS INTEGER)
ELSE Identifier END
我做错了什么?
谢谢。
您的逻辑是以某种方式重构字符串,但是对于 order by
,您需要这样的东西:
order by (case when CAST(Identifier AS INTEGER) <> 0 then 1
when Identifier like '%-%' then 2
else 3
end),
identifier
注意:这假设数字永远不会 0
。
1) 按包含 -
的字符串排序,因此它们首先出现
2) 按包含 -
的字符串中 -
之前的第一部分排序,在适用的情况下将它们转换为整数,否则按列本身排序
3) 在包含 -
的字符串中按 -
之后的第二部分排序,在适用的情况下将它们转换为整数,否则按列本身排序
select val
from t
order by
case when val like '%-%' then 1 else 2 end
,case when substr(val,1,instr(val,'-')-1) glob '*[0-9]*'
then cast(substr(val,1,instr(val,'-')-1) as integer)
when substr(val,1,instr(val,'-')-1) glob '*[a-zA-Z]*'
then substr(val,1,instr(val,'-')-1)
else val end
,case when val like '%-%' then cast(substr(val,instr(val,'-')+1) as integer)
else val end