Sql 对文本数据(如数字)进行排序,以便遵循数值

Sql 对文本数据(如数字)进行排序,以便遵循数值,sql,db2,alphanumeric,Sql,Db2,Alphanumeric,在数据库中,如果我有一个文本字段,其中的数字是数据的一部分,并且我尝试进行排序,那么这些数字不会按顺序返回,而是按字母顺序“伪”返回 我“期待”这种行为,并对此感到满意。但是,如果可能的话,用户已经请求按数字和字母顺序排序 示例数据(已排序): 客户-希望“2”在“100”之前排序,“200”在“1001”之前排序 数字/字母组合出现的地方就是这个问题变得棘手的地方。这个问题是因为被命名的物品可以被命名为任何东西(“盒子一”、“盒子一”、“盒子一”、“盒子一”、“盒子一”、“盒子一”等等),比如

在数据库中,如果我有一个文本字段,其中的数字是数据的一部分,并且我尝试进行排序,那么这些数字不会按顺序返回,而是按字母顺序“伪”返回

我“期待”这种行为,并对此感到满意。但是,如果可能的话,用户已经请求按数字和字母顺序排序

示例数据(已排序):

客户-希望“2”在“100”之前排序,“200”在“1001”之前排序 数字/字母组合出现的地方就是这个问题变得棘手的地方。这个问题是因为被命名的物品可以被命名为任何东西(“盒子一”、“盒子一”、“盒子一”、“盒子一”、“盒子一”、“盒子一”等等),比如按“名字”排序,但许多人给他们的孩子取了一个数字——排序是一场噩梦

我曾经玩弄过这样一个想法,将所有“仅数字”字段合并,转换为数字并排序,然后与alpha nums合并。。。因此,至少这些数字是“如预期的”——但开销似乎令人难以忍受

根据用户的请求,我希望“2erd”应该在“100”之前排序,“22Asd”应该在“22Asd”之前排序

有什么建议或解决办法吗?这一定会发生。 我们正在使用DB2V9.5


前导零也是一个“问题”,因为“0000123”排序在“122”之前。

如果您使用的是MySQL,您可以执行以下操作:

order by field+0, field
MySQL自动将字符串中最左边的字符转换为算术运算

在其他数据库中,这似乎更加困难。在某些情况下,可以使用REGEXP替换模式(例如删除第一个非数字后面的所有字符)。或者,您可能需要循环角色本身,例如:

order by (case when left(field, 5) not like '[^0-9]' then cast(left(field, 5) as int)
               when left(field, 4) not like '[^0-9]' then cast(left(field, 4) as int)
               when left(field, 3) not like '[^0-9]' then cast(left(field, 3) as int)
               when left(field, 2) not like '[^0-9]' then cast(left(field, 2) as int)
               when left(field, 1) not like '[^0-9]' then cast(left(field, 1) as int)
           end), field

如果您使用的是MySQL,则可以执行以下操作:

order by field+0, field
MySQL自动将字符串中最左边的字符转换为算术运算

在其他数据库中,这似乎更加困难。在某些情况下,可以使用REGEXP替换模式(例如删除第一个非数字后面的所有字符)。或者,您可能需要循环角色本身,例如:

order by (case when left(field, 5) not like '[^0-9]' then cast(left(field, 5) as int)
               when left(field, 4) not like '[^0-9]' then cast(left(field, 4) as int)
               when left(field, 3) not like '[^0-9]' then cast(left(field, 3) as int)
               when left(field, 2) not like '[^0-9]' then cast(left(field, 2) as int)
               when left(field, 1) not like '[^0-9]' then cast(left(field, 1) as int)
           end), field

我手头没有9.5实例,但它应该可以工作,因为它只使用DB2 9.5中可用的功能:

  db2 => with input (f) as ( 
    values ('100'), ('1001'), ('1110'), ('1010101E'),
   ('2'), ('200'), ('22ER'), ('Abd'), ('Bre')
  )
  select * from input
  order by case 
    when 
      length(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) = 0 
        then 9999999999999 -- alpha only; make sure it sorts after all numbers
    else 
      integer(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) -- convert to integer 
  end, -- this column is numeric
  case
    when 
      length(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) = 0 
        then f -- alpha only
    else '' -- nothing; sorts before other strings 
  end
  ; 

  F       
  --------
  2       
  22ER    
  100     
  200     
  1001    
  1110    
  1010101E
  Abd     
  Bre     

    9 record(s) selected.

TRANSLATE函数用于从列值中删除非数字字符,允许您对剩余数据进行数字排序。

我手头没有9.5实例,但这应该可以工作,因为它只使用DB2 9.5中可用的功能:

  db2 => with input (f) as ( 
    values ('100'), ('1001'), ('1110'), ('1010101E'),
   ('2'), ('200'), ('22ER'), ('Abd'), ('Bre')
  )
  select * from input
  order by case 
    when 
      length(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) = 0 
        then 9999999999999 -- alpha only; make sure it sorts after all numbers
    else 
      integer(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) -- convert to integer 
  end, -- this column is numeric
  case
    when 
      length(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) = 0 
        then f -- alpha only
    else '' -- nothing; sorts before other strings 
  end
  ; 

  F       
  --------
  2       
  22ER    
  100     
  200     
  1001    
  1110    
  1010101E
  Abd     
  Bre     

    9 record(s) selected.

TRANSLATE函数用于从列值中删除非数字字符,允许您对剩余数据进行数字排序。

另一种方法是修剪字符串并右对齐。假设你的专栏有20个字符宽。你可以用像这样的东西

right(repeat(' ',20)||trim(yourdata),20)

诚然,如果字符串以非数字字符开头,这种方法就不能很好地工作。

另一种方法是修剪并右对齐字符串。假设你的专栏有20个字符宽。你可以用像这样的东西

right(repeat(' ',20)||trim(yourdata),20)
诚然,如果字符串以非数字字符开头,这种方法就不能很好地工作。

您可以这样做吗(假设sortfield小于11个字符,如果它更长) 您需要增加零和截断点的数量,或者进行测试):

按右排序(concat(“0000000000”,sortField),10)

您能做如下操作吗(假设sortField小于11个字符,如果更长) 您需要增加零和截断点的数量,或者进行测试):


按右排序(concat(“0000000000”,sortField),10)

您使用的是什么数据库?在什么平台上?z/OS,我猜?linux(suse&slackware)那么就没有DB2V9这样的东西了:是9.1、9.5还是9.7?thx是如此精确的mustaccio,我不知道点号,因为我不是管理数据库的人。。。但是,如果排序功能随9系列中的任何版本而更改,我会感到惊讶。。。所以我怀疑是否有必要把它打下来。9.5是我们当前的版本-您使用的是什么数据库?在什么平台上?z/OS,我猜?linux(suse&slackware)那么就没有DB2V9这样的东西了:是9.1、9.5还是9.7?thx是如此精确的mustaccio,我不知道点号,因为我不是管理数据库的人。。。但是,如果排序功能随9系列中的任何版本而更改,我会感到惊讶。。。所以我怀疑是否有必要把它打下来。9.5是我们当前的版本-这看起来很有希望,但我得到了SQL错误[22018]:在函数“INTEGER”的字符串参数中发现无效字符。。SQLCODE=-420,SQLSTATE=22018,DRIVER=3.59.81在函数“INTEGER”的字符串参数中找到无效字符。。SQLCODE=-420,SQLSTATE=22018,DRIVER=3.59.81如果字符串中有非字母数字,例如“10%01”,则会出现问题。。。我们的数据集中很可能有下划线或破折号,那么您的示例数据不完整。解决方案的质量与问题的质量一样好。将所有可能的非数字字符添加到翻译列表中。您也可以考虑非整数编号的可能性。这看起来很有希望,但我得到SQL错误(22018):在函数“整数”的字符串参数中找到无效字符。SQLCODE=-420,SQLSTATE=22018,DRIVER=3.59.81在函数“INTEGER”的字符串参数中找到无效字符。。SQLCODE=-420,SQLSTATE=22018,DRIVER=3.59.81如果字符串中有非字母数字,例如“10%01”,则会出现问题。。。我们的数据集中很可能有下划线或破折号,那么您的示例数据不完整。解决方案的质量与问题的质量一样好。将所有可能的非数字字符添加到翻译列表中。你也可以考虑非整数的可能性。