【问题标题】:Check if similar value exists in database [closed]检查数据库中是否存在类似的值[关闭]
【发布时间】:2015-02-02 06:56:01
【问题描述】:

我想检查数据库中是否存在相等或相似的值。 我已经构建了这段代码:

SqlConnection con1 = new SqlConnection();
con1.ConnectionString = ConfigurationManager.ConnectionStrings["ChipstarALConn"].ToString();

string sql1 = "select Count(*) from SMS_KOD where KOD = @name";
SqlCommand cmd1 = new SqlCommand(sql1, con1);
cmd1.Parameters.AddWithValue("@name", TextBox1.Text);
con1.Open();

int result = (int)cmd1.ExecuteScalar();
if (result > 0)
{
    Lab0.Text = "true";
}
else
{
    Lab0.Text = "false";
}

它返回true。现在我想返回true,如果在TextBox 上输入的string 输入错误但类似。 例如,如果数据库中的值为ASDFG,而我设置TextBox ASDFHAXDFG,它也必须返回true

【问题讨论】:

  • 标准是什么?输入任何错误的值是否应该为真,正确的值为假,还是您有其他逻辑?
  • 如果数据库中的值为“ASDFG”,而用户输入“AXDFG”,那是什么情况,不匹配。你想使用某种模糊匹配算法吗?如果是这样,这对于 SO 问题来说太宽泛了。
  • 什么是TextBox1.Text 这是 MVC 还是 Webforms?
  • 我猜他想要字符串亲戚,其中一个字符不违反方程。
  • @StephenMuecke 这是一个数字列表:2 6 13 19 20 21 24 33 38 40。您需要选择它们的子字符串。或者你可以参考anastasiosyal.com/POST/2009/01/11/18.ASPX

标签: c# asp.net sql-server asp.net-mvc visual-studio


【解决方案1】:

您可以在 T-SQL 中使用 Levenshtein 距离算法。例如(来自here):

CREATE FUNCTION dbo.Levenshtein(@s nvarchar(4000), @t nvarchar(4000), @d int)
RETURNS int
AS
BEGIN
  DECLARE @sl int, @tl int, @i int, @j int, @sc nchar, @c int, @c1 int,
    @cv0 nvarchar(4000), @cv1 nvarchar(4000), @cmin int
  SELECT @sl = LEN(@s), @tl = LEN(@t), @cv1 = '', @j = 1, @i = 1, @c = 0
  WHILE @j <= @tl
    SELECT @cv1 = @cv1 + NCHAR(@j), @j = @j + 1
  WHILE @i <= @sl
  BEGIN
    SELECT @sc = SUBSTRING(@s, @i, 1), @c1 = @i, @c = @i, @cv0 = '', @j = 1, @cmin = 4000
    WHILE @j <= @tl
    BEGIN
      SET @c = @c + 1
      SET @c1 = @c1 - CASE WHEN @sc = SUBSTRING(@t, @j, 1) THEN 1 ELSE 0 END
      IF @c > @c1 SET @c = @c1
      SET @c1 = UNICODE(SUBSTRING(@cv1, @j, 1)) + 1
      IF @c > @c1 SET @c = @c1
      IF @c < @cmin SET @cmin = @c
      SELECT @cv0 = @cv0 + NCHAR(@c), @j = @j + 1
    END
    IF @cmin > @d BREAK
    SELECT @cv1 = @cv0, @i = @i + 1
  END
  RETURN CASE WHEN @cmin <= @d AND @c <= @d THEN @c ELSE -1 END
END
GO

现在这样的工作:

SELECT Kod, Levenshtein  = dbo.Levenshtein(Kod, @name, 2)
FROM SMS_KOD
WHERE dbo.Levenshtein(Kod, @name, 2) <> -1

您可以使用SqlDataAdapter 填充DataTable。如果它包含行,则至少有相似的Kods。

Sql-Fiddle

这是一个可能的实现:

string sql = @"SELECT Kod, Levenshtein = dbo.Levenshtein(Kod, @name, 2)
               FROM SMS_KOD
               WHERE dbo.Levenshtein(Kod, @name, 2) <> -1";

var table = new DataTable();
using (var con = new SqlConnection(connectionString))
using (var da = new SqlDataAdapter(sql, con))
    da.Fill(table);

if(table.Rows.Count > 0)
{
    int equals = table.AsEnumerable().Where(r => r.Field<int>("Levenshtein") == 0).Count();
    if(equals > 0)
        Lab0.Text = string.Format("{0} equal found in database.", equals);
    else
    {
        int similars = table.AsEnumerable()
            .Where(r => r.Field<int>("Levenshtein") != 0)
            .Count();
        Lab0.Text = string.Format("{0} similar found in database.", similars);
    }
}
else
    Lab0.Text = "No equal or similar found in database!";

【讨论】:

  • 谢谢。你一直很有帮助。现在我必须弄清楚如何将它放在我上面的代码中。如果这对你来说没问题,你能帮我一把吗?谢谢。
  • @aldoblack:我添加了一个可能的实现。
  • 谢谢。有效。非常感谢您。 :)
猜你喜欢
  • 1970-01-01
  • 2013-10-06
  • 2014-09-10
  • 2016-10-20
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 2013-06-23
  • 2017-09-28
相关资源
最近更新 更多