英勇无比的筷子 · 删除Autorun.inf的方法-阿里云开发者社区· 7 月前 · |
飘逸的小摩托 · mysql存储过程实现动态sql_mysql ...· 1 年前 · |
礼貌的炒饭 · 如何解决 "ADB服务器没有ACK ...· 1 年前 · |
怕考试的仙人球 · python-opencv实现最近邻插值和双 ...· 1 年前 · |
爱跑步的野马 · 查找Python字符串中某个词汇的所有索引 ...· 1 年前 · |
我想对字母数字字符串进行排序...
示例字符串:
D12,D13
F19,F20
A12,A13
F10,F11
A1,A2
A5,A6
D4,D5
F5,F6,F7
所需输出:
A1,A2
A5,A6
A12,A13
D4,D5
D12,D13
F5,F6,F7
F10,F11
F19,F20
救救我!
发布于 2011-08-06 02:25:39
基于新的需求和@kuru kuru的回答,我希望这个order by子句说明了为什么规范化是一件好事。仅仅因为它对JSON和Ajax有好处并不意味着您应该这样对待您的数据库:
DECLARE @t TABLE (x VARCHAR(32));
INSERT @t VALUES
('D12,D13'),
('F19,F20'),
('A12,A13'),
('F10,F11'),
('D14'),
('A1,A2'),
('A5,A6'),
('D4,D5'),
('F5,F6,F7'),
('AA1,AA2'),
('Z98,Z99');
SELECT x FROM @t
ORDER BY CASE
WHEN UPPER(x) LIKE '[A-Z][A-Z]%'
THEN 'Z' + LEFT(x,2) ELSE LEFT(x,1) END,
CONVERT(INT,
CASE WHEN x LIKE '%,%' THEN
SUBSTRING(x, PATINDEX('%[0-9]%', x),
CHARINDEX(',', x)-PATINDEX('%[0-9]%', x))
SUBSTRING(x, PATINDEX('%[0-9]%', x), 32)
);
发布于 2011-08-05 01:30:33
正如@JNK和@Aaron Bertrand所提到的,T-SQL并不是这项任务的最佳选择。
话虽如此,还是有几个问题需要解决。
字母部分和数字部分,否则就没有办法"A5,...“了。将在"A12,...“之前排序,因为在比较字符串值时,"A5”在"A1“之后。为了获得正确的排序顺序,您必须解析这些值并将"A5“转换为"A05”(或需要多少有效数字)。
一旦对字符串中的值进行了规范化,就可以进行比较和排序了。
发布于 2011-08-06 01:44:50
我不敢相信每个人都在说TSQL的坏话。:-)
在对数据进行排序之前,您不必对数据进行标准化。(当然,在任何情况下都不是显式的-- SQL引擎在处理ORDER BY子句时只需戴上一些护目镜,它就可以很好地工作)。
这是一个在TSQL中工作的示例...我知道看起来右侧没有理由正确排序,但它实际上确实正确排序。
declare @table TABLE (item varchar(10))
insert into @table(item) values('FF5')
insert into @table(item) values('Z10')
insert into @table(item) values('F15')
insert into @table(item) values('F20')
insert into @table(item) values('A7')
insert into @table(item) values('A12')
英勇无比的筷子 · 删除Autorun.inf的方法-阿里云开发者社区 7 月前 |
礼貌的炒饭 · 如何解决 "ADB服务器没有ACK "的错误?[重复] 1 年前 |
爱跑步的野马 · 查找Python字符串中某个词汇的所有索引 - 知乎 1 年前 |