简体   繁体   English

按数字和字符串开头的数字排序SQL服务器表

[英]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 |
+-----------------------------+---+

Demo 演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM