我正在使用来自外部来源的表,并且无法对其进行“清理”。 有一列,其中nvarchar(20)包含约95%的时间的整数,但偶尔包含alpha。 我想使用类似

select * from sch.tbl order by cast(shouldBeANumber as integer)

但这会在奇数“ 3A”或“ D”或“ SUPERCEDED”上引发错误。

有没有办法说“如果可以,请像数字一样排序,否则按字符串排序”? 我知道那句话有些草率,但这基本上就是我想要的。

例如,假设值是

7,1,5A,SUPERCEDED,2,5,SECTION

如果以下列任何一种方式对它们进行排序,我将感到很高兴(因为我真的只需要使用数字方法即可)

1,2,5,7,5A,SECTION,SUPERCEDED
1,2,5,5A,7,SECTION,SUPERCEDED
SECTION,SUPERCEDED,1,2,5,5A,7
5A,SECTION,SUPERCEDED,1,2,5,7

#1楼 票数:6 已采纳

我真的只需要使用数字的

这只会给您数字,正确排序:

SELECT
    *
    FROM YourTable
    WHERE ISNUMERIC(YourColumn)=1
    ORDER BY YourColumn

#2楼 票数:1

select 
  * 
from 
  sch.tbl 
order by 
  case isnumeric(shouldBeANumber) 
  when 1 then cast(shouldBeANumber as integer)
  else 0
  end

#3楼 票数:0

SELECT
  (CASE ISNUMERIC(shouldBeANumber)
    WHEN 1 THEN
      RIGHT(CONCAT('00000000',shouldBeANumber), 8)
    ELSE
      shouoldBeANumber) AS stringSortSafeAlpha
ORDEER BY
  stringSortSafeAlpha

这会将前导零添加到所有真正是数字的shouldBeANumber值中,而将所有其余值保留下来。 这样,当您进行排序时,您可以使用alpha排序,但仍获得正确的值(使用alpha排序,“ 100”将小于“ 50”,但是如果将“ 50”更改为“ 050”,则可以正常工作)精细)。 请注意,在此示例中,我添加了8个前导零,但是您只需要足够的前导零即可覆盖列中可能的最大整数。

#4楼 票数:0

如果您的电话号码长度不超过100字符:

WITH    chars AS
        (
        SELECT  1 AS c
        UNION ALL
        SELECT  c + 1
        FROM    chars
        WHERE   c <= 99
        ),
        rows AS
        (
        SELECT  '1,2,5,7,5A,SECTION,SUPERCEDED' AS mynum
        UNION ALL
        SELECT  '1,2,5,5A,7,SECTION,SUPERCEDED'
        UNION ALL
        SELECT  'SECTION,SUPERCEDED,1,2,5,5A,7'
        UNION ALL
        SELECT  '5A,SECTION,SUPERCEDED,1,2,5,7'
        )
SELECT  rows.*
FROM    rows
ORDER BY
        (
        SELECT  SUBSTRING(mynum, c, 1) AS [text()]
        FROM    chars
        WHERE   SUBSTRING(mynum, c, 1) BETWEEN '0' AND '9'
        FOR XML PATH('')
        ) DESC

  ask by jwl translate from so

未解决问题?本站智能推荐:

1回复

在SQLServer中按列组排序

我的问题是从2个结果中排序数据。 两个结果集中的计数相同(现在,我将两个结果集中在一个中,并按Source-a或b进行过滤)。 我必须显示数据,例如-对于每个ID1和ID2组合,按源顺序显示它们; 源'a'-首先是源'b')。 对于ID1和ID2组合,源b可能具有所有空值; 但一定要有
13回复

MicrosoftSQL2005中的自然(人类字母数字)排序

我们有一个大型数据库,在该数据库上有 DB 端分页。 这很快,在几分之一秒内从数百万条记录中返回 50 行的页面。 用户可以定义自己的排序,基本上是选择要排序的列。 列是动态的 - 有些具有数值,有些具有日期和一些文本。 虽然大多数按预期排序文本以愚蠢的方式排序。 好吧,我说愚蠢,它对计算机有意义,
3回复

SQLServerGUID排序算法。为什么?

唯一标识符的问题我们有一个现有的数据库,它广泛地(不幸的是!)使用唯一标识符作为主键和某些表的一些可为空的列。 我们遇到过这样一种情况,在这些表上运行的一些报告根据这些 un​​iqueidentifier 进行排序,因为表中没有其他列可以进行有意义的排序(这不是讽刺!)。 目的是排序,以便按插入顺
2回复

SQLServer2005和SQLServer2012中选择查询的默认排序顺序

SQL Server 2005 和 SQL Server 2012 中选择查询的默认排序顺序有区别吗? 我有一个没有主键的表变量。 当我对 SQL Server 2005 中的表变量执行选择查询时,记录被选择并按照其中一列的字母顺序显示。 在 SQL Server 2012 中,记录的显示顺序与父
1回复

SQL排序和连字符

有没有办法在SQL Server 2005中轻松排序而忽略字符串字段中的连字符? 目前我必须执行REPLACE(fieldname,' - ','')或函数来删除sort子句中的连字符。 我希望有一个标志,我可以设置在存储过程的顶部或其他东西。 Access和GridView默认排序似乎
4回复

SQL主键排序顺序

我正在使用MS SQL Server 2005 我有一个3列的表,我存储用户消息映射,如: PK位于3列,msg_id是存储消息的消息表的FK 以上是我根据3列上的PK看到的物理存储 现在我的查询必须返回顶部有最新消息的给定用户的消息(按msg_id DESC排序) 此映射表
2回复

删除重复项并对结果进行排序,以模拟group_concat

我已经找到了这个有趣的话题 在Microsoft SQL Server 2005中模拟group_concat MySQL函数? 那给我 但是,我想从每次考试中删除重复项,并对合并的结果进行排序,以便获得 谢谢。
3回复

Sql查询对数字进行排序并获得输出为1.1.1,1.1.2,1.1.3

我希望sql查询输出为 1.1.1,1.1.2,1.1.3... 我尝试了order by子句,但我得到的结果为1.1.1,1.1.10,1.1.11,1.1.2,1.1.3... 我的程序是: