比较两个字符串及其中的版本号

时间:2014-12-09 08:12:13

标签: c# sql .net string

我需要在SQL中比较以下格式的2个字符串:

  

name_1.2.3

有人可以解释如何正确比较它们吗?你如何比较非int值?

过去,当您将字符串与数字进行比较时,我遇到了一个问题:比较是按字面意思完成的。这让我陷入了“name_1.5.3”比“name_1.20.3”更“大”的问题,因为它可能会比较char的char,但这不是我想要实现的。

某些SQL或C#示例将非常有用。

我在C#中的部分代码:

for (int i = 0; i < PDCs.Count(); i++)
{ 
    if (foundInstallOrder)
    {
        string justNumbers = new String(PDCs[i].Where(Char.IsDigit).ToArray());
        a = Convert.ToInt32(justNumbers);
        if (projPDCs.Count() <= i)
        {
            b = 0;
        }
        else
        {
            justNumbers = new String(projPDCs[i].Where(Char.IsDigit).ToArray());
            b = Convert.ToInt32(justNumbers);
        }

        if (a > b )//compare the currentPDC with the projfound, if result is 1 => that means current is within range
        {
            foundInstallOrder = true;
            arrayInstallOrder.Add(lines);
            break;
        }

        else if (a == b)  //numbers are equal
        {
            foundInstallOrder = true;
        }
        else                                 //lower
        {
            foundInstallOrder = false;
            break;
        }
    }
}

正如您所看到的那样,这太复杂了,但它正在努力,但我正在努力寻找更好的解决方案。

3 个答案:

答案 0 :(得分:1)

使用String.split('.')然后int.parse每个“部分字符串”对字符串进行标记。这允许您根据需要检查major,minor和build。

答案 1 :(得分:1)

虽然我建议您将这些数字保存在表中的单独列中以便更快/更快地查询,但您也可以通过向SQL服务器添加正则表达式支持并在查询中使用它来解决此问题。

<强> SETUP

创建一个名为&#39; SqlExtensions&#39;的.NET类库,其中包含以下代码:

using System.Data.SqlTypes;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

namespace SqlExtensions
{
    public static partial class UserDefinedFunctions
    {
        [SqlFunction]
        public static SqlString RegexGroup(SqlString input, SqlString pattern, SqlString name)
        {
            Regex regex = new Regex(pattern.Value, RegexOptions.Singleline);
            Match match = regex.Match(input.Value);
            return match.Success ? new SqlString(match.Groups[name.Value].Value) : SqlString.Null;
        }
    }
}

内置版本。

然后,使用SQL Server Management Studio将类库添加到SQL Server:

  • 连接到数据库服务器
  • 展开Databases
  • 展开您正在处理的数据库
  • 展开Programmability
  • 右键点击Assemblies
  • 通过浏览到上面创建的类库DLL
  • 添加新程序集

使用SQL Server Management Studio将标量值函数添加到数据库:

  • 选择您正在处理的数据库
  • 点击New Query并执行此查询:
CREATE FUNCTION [dbo].[RegexGroup] (@input nvarchar(max), @pattern nvarchar(max), @name nvarchar(max))
RETURNS nvarchar(max)
AS EXTERNAL NAME [SqlExtensions].[SqlExtensions.UserDefinedFunctions].[RegexGroup];

如果未启用.NET执行,请执行新查询:

  • 选择您正在处理的数据库
  • 点击New Query并执行此查询
sp_configure @configname=clr_enabled, @configvalue=1;
GO
RECONFIGURE
GO

<强> QUERY

SELECT
    *,
    dbo.RegexGroup(Name, '^(?<n>[^_]*)_', 'n') AS n,
    CONVERT(INT, dbo.RegexGroup(Name, '_(?<major>[0-9]+)\.', 'major')) AS Major,
    CONVERT(INT, dbo.RegexGroup(Name, '\.(?<minor>[0-9]+)\.', 'minor')) AS Minor,
    CONVERT(INT, dbo.RegexGroup(Name, '\.(?<build>[0-9]+)$', 'build')) AS Build
FROM dbo.Table_1;

<强> RESULT

name_1.5.3  name    1   5   3
name_1.20.3 name    1   20  3
name_5.19.2 name    5   19  2
name_0.6.3  name    0   6   3
name_1.20.2 name    1   20  2

答案 2 :(得分:0)

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        List<NameVersion> lst = new List<NameVersion>();
        lst.Add(new NameVersion("name_1.2.3"));
        lst.Add(new NameVersion("name_1.20.3"));
        lst.Sort(delegate(NameVersion x, NameVersion y) 
        {
            int i = x.a.CompareTo(y.a);
            if (i == 0)
                i = x.b.CompareTo(y.b);
            if (i == 0)
                i = x.c.CompareTo(y.c);
            return i;
        });
    }
}

public class NameVersion
{
    public string Name = "";
    public int a, b, c;
    public NameVersion(string text)
    {
        Name = text;
        string[] sa = text.Split('_');
        string[] sb = sa[1].Split('.');
        a = Convert.ToInt32(sb[0]);
        b = Convert.ToInt32(sb[1]);
        c = Convert.ToInt32(sb[2]);
    }
}
相关问题