【问题标题】:Orderby with a string that contains part numbers and part letters带有包含零件编号和零件字母的字符串的 Orderby
【发布时间】:2014-10-14 17:00:15
【问题描述】:

我使用的是 MSSQL ADO.NET,我需要按雇主代码对订单进行数字排序,尽管每个订单代码前面都有 2X 个字母。

例如:

HP1234
HP1233
HP1236

本质上,我试图将数字与字母分开,并按 asc 或 desc 排序,只是用数字给出一些顺序。我想知道是否有人可以建议一个使用 orderby 子句的好方法。

【问题讨论】:

  • 总是2个字符和4个数字吗?或者这4个数字的数量可能会有所不同?如果您知道前 2 个字符总是要被省略,只需将长度减 2 并转换为数字。
  • 在使用子字符串删除前两个字符后对列使用 order by。
  • 它总是两个字母,数字的长度不同。前两个总是字母,虽然不在输出中,但要按顺序省略。
  • 如果你有标准化的数据,每个数据元素都是它自己的列,这根本不是问题。当您将 2 条数据合并到一个列中时,您违反了 1NF 并遇到了各种问题。

标签: sql-server vb.net ado.net


【解决方案1】:
SELECT *
FROM YourTable
ORDER BY CONVERT(int, RIGHT(employer_code, LEN(employer_code) - 2))

【讨论】:

  • 谢谢 namrehs。非常有用的一段scipt。正是我需要的。
【解决方案2】:

请注意,我没有添加任何错误检查,但如果模式发生更改等,这将有所帮助。即使这是 C#,您也可以将代码转换为 VB。

void Main()
{
    var arrayOfString = new string []{"HP1234","HP1233","HP1236"};
    var pat =@"(?<name>\d+)";
    Regex r = new Regex(pat, RegexOptions.IgnoreCase);
    var orderedItems =  arrayOfString.OrderBy(x=>{
        var match =  r.Match(x);

        return match.Groups["name"].Value;
    });

    foreach (var item in orderedItems)
    {
        Console.WriteLine(item);
    }

}

VB 代码

Private Sub Main()
    Dim arrayOfString = New String() {"HP1234", "HP1233", "HP1236"}
    Dim pat = "(?<name>\d+)"
    Dim r As New Regex(pat, RegexOptions.IgnoreCase)
    Dim orderedItems = arrayOfString.OrderBy(Function(x) GetSortOrder(x,r))

    For Each item As string In orderedItems
        Console.WriteLine(item)
    Next

End Sub

Function GetSortOrder(x , r)    
    Dim match = r.Match(x) 
    Return match.Groups("name").Value
End Function

【讨论】:

  • C# 是我选择的语言,我认为这里编写的代码很容易转换为 VB。如果 OP 在转换方面遇到问题,我绝对不介意为他转换。我给了他另一种思考解决方案的方法。由于他已经在使用 ADO.Net,因此他还可以在客户端代码中执行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2018-01-17
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
相关资源
最近更新 更多