[英]Numeric sorting SQL server table by column starting with number and string
I'm going to sort an SQL server table by a column having following data: 我将按照具有以下数据的列对SQL服务器表进行排序:
2.5.1 Sonstiges
1.1.1 Pflegstandards
5.1.7 Arbeitsgemeinschaften
1.2.1 Anforderungen
2.4.5 Betriebsarzt
B Kernprozesse
1.1.1.4 Umgang mit
2.3.3 Kardiologie
......
as you see most of records begin with a number, but there are some starting with string as well. 如你所见,大多数记录以数字开头,但也有一些以字符串开头。 I use following query to cover both cases: 我使用以下查询来涵盖这两种情况:
SELECT * from DocumentCategories
order by
case IsNumeric(replace( LEFT(name, CHARINDEX(' ', name)),'.',''))
when 0 then name
when 1 then cast(replace( LEFT(name, CHARINDEX(' ', name)),'.','') as int)
end
But I get an error regarding varchar to int conversion (because of record containg "B Kernprozesse"). 但是我得到一个关于varchar到int转换的错误(因为记录包含“B Kernprozesse”)。 So what's the role of case/when here? 那么案件/什么时候在这里扮演什么角色? Have I missed anything? 我错过了什么吗?
I want the output to look something like below: 我希望输出看起来如下所示:
B Kernprozesse
1.1.1 Pflegstandards
1.2.1 Anforderungen
2.3.3 Kardiologie
2.4.5 Betriebsarzt
2.5.1 Sonstiges
5.1.7 Arbeitsgemeinschaften
1.1.1.4 Umgang mit
...... ......
As mentioned in the comments, you can use TRY_CAST
like so: 如评论中所述,您可以像这样使用TRY_CAST
:
SELECT * FROM @DocumentCategories
ORDER BY
CASE WHEN TRY_CAST(replace( LEFT(name, CHARINDEX(' ', name)),'.','') AS INT) IS NULL
THEN 0
ELSE cast(replace( LEFT(name, CHARINDEX(' ', name)),'.','') as int)
END
If you are in a SQL_SERVER enviornment prior to version 2012, you can use ISNUMERIC
and get the same results: 如果您在2012版之前的SQL_SERVER环境中,则可以使用ISNUMERIC
并获得相同的结果:
SELECT * FROM @DocumentCategories
ORDER BY
CASE WHEN ISNUMERIC(replace( LEFT(name, CHARINDEX(' ', name)),'.','')) = 0
THEN 0
ELSE cast(replace( LEFT(name, CHARINDEX(' ', name)),'.','') as int)
END
Here are the results in both cases: 以下是两种情况下的结果:
name
=====================
B Kernprozesse
1.1.1 Pflegstandards
1.2.1 Anforderungen
2.3.3 Kardiologie
2.4.5 Betriebsarzt
2.5.1 Sonstiges
5.1.7 Arbeitsgemeinschaften
1.1.1.4 Umgang mit
Are you just looking for 你在寻找吗?
SELECT *
FROM (
VALUES
('2.5.1 Sonstiges'),
('1.1.1 Pflegstandards'),
('5.1.7 Arbeitsgemeinschaften'),
('1.2.1 Anforderungen'),
('2.4.5 Betriebsarzt'),
('B Kernprozesse'),
('1.1.1.4 Umgang mit'),
('2.3.3 Kardiologie')
) T(Str)
ORDER BY
CASE WHEN TRY_CAST(LEFT(Str, 1) AS INT) IS NOT NULL
THEN 0
ELSE 1
END
Which will returns 哪个会回来
+-----------------------------+
| Str |
+-----------------------------+
| 1.1.1 Pflegstandards |
| 5.1.7 Arbeitsgemeinschaften |
| 1.2.1 Anforderungen |
| 2.4.5 Betriebsarzt |
| 2.3.3 Kardiologie |
| 1.1.1.4 Umgang mit |
| 2.5.1 Sonstiges |
| B Kernprozesse |
+-----------------------------+
UPDATE: 更新:
According to the last update of your question, you're looking for 根据你问题的最新更新,你正在寻找
WITH A AS
(
SELECT *, ((LEN(Str) - LEN(REPLACE(Str, '.', ''))) * 2) + 1 N
FROM (
VALUES
('2.5.1 Sonstiges'),
('1.1.1 Pflegstandards'),
('5.1.7 Arbeitsgemeinschaften'),
('1.2.1 Anforderungen'),
('2.4.5 Betriebsarzt'),
('B Kernprozesse'),
('1.1.1.4 Umgang mit'),
('2.3.3 Kardiologie')
) T(Str)
)
SELECT *
FROM A
ORDER BY CASE WHEN TRY_CAST(REPLACE(LEFT(Str, N), '.', '') AS INT) IS NULL
THEN 0
ELSE CAST(REPLACE(LEFT(Str, N), '.', '') AS INT)
END
Returns: 返回:
+-----------------------------+---+
| Str | N |
+-----------------------------+---+
| B Kernprozesse | 1 |
| 1.1.1 Pflegstandards | 5 |
| 1.2.1 Anforderungen | 5 |
| 2.3.3 Kardiologie | 5 |
| 2.4.5 Betriebsarzt | 5 |
| 2.5.1 Sonstiges | 5 |
| 5.1.7 Arbeitsgemeinschaften | 5 |
| 1.1.1.4 Umgang mit | 7 |
+-----------------------------+---+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.