我需要在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;
}
}
}
正如您所看到的那样,这太复杂了,但它正在努力,但我正在努力寻找更好的解决方案。
答案 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
使用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]);
}
}