【问题标题】:Search on variable fields with multiple match types搜索具有多种匹配类型的变量字段
【发布时间】:2017-01-25 19:21:19
【问题描述】:

问题:

如何使用 SQL Server 在 .NET 中构建这样的搜索?注意“分数”和“最大值”列。 (这些不是我的术语。“Max”似乎代表查询的最大值,“Score”代表搜索获得的值,小于或等于“Max”。)

这是搜索输入的显示方式:

此搜索包括 SSN:

此搜索不包括 SSN:

详情:

  1. 用户可以输入以下字段中的一个或多个:name_first (varchar(254))、name_middle (varchar(254))、name_last (varchar(254))、date_of_birth (date)、social_security_number (varchar(50)) , 性别 (char(1)), ABO_blood_type (varchar(2)), Rh_blood_type (varchar(3))。
  2. 匹配可能是部分匹配,例如名称。它也可能只允许精确匹配,例如男性/女性。
  3. 不同的字段可能比其他字段更重要。例如,社会保险号的完全匹配比性别匹配更具体。

想法

  1. Soundex 函数可能有助于名称匹配
  2. SSN 匹配应覆盖所有其他字段,因为它是最具体的。在示例中,它会增加与除 SSN 之外的所有字段的匹配项相关的 Max/Score 值。
  3. 有趣的是,不匹配的 SSN 似乎包含“无信息”,而实际上它与搜索条件不匹配。
  4. 如果没有其他选择,我是否应该制定某种评分方案?

否则,我不知道从哪里开始。谢谢!

【问题讨论】:

  • 您是否设计了一个表格来保存正在搜索的数据?
  • 试试like这里是定义:link
  • 不幸的是,你的问题对于 StackOverflow 来说有点太宽泛了。我建议你尝试一些事情,任何事情,并继续尝试,直到遇到你无法克服的实际障碍。然后发布你的代码和你得到的错误。通过这种方式,您更有可能从该网站获得帮助。
  • 请解释一下“Score”和“Max”的关系。

标签: c# sql-server


【解决方案1】:

这个答案并不试图代表一个完整的解决方案,而是一些关于如何开始的提示。

  1. 我会想象一个存储过程,其目的是根据提供的条件查询底层数据表。

  2. 对于每个表单字段,都给出了一个参数。因此,例如@name_first varchar(254) 将代表相关的表单字段。重要的是传递到存储过程的NULL 值表明未提供特定的表单字段(或选择了ANY)。

  3. 对于正在搜索的数据集中的每一行,都会计算一个分数。确切的公式取决于您,但一般规则可能是这样的

    • 当给定参数为 NULL 时,字段的结果为零
    • 列值不匹配时同理
    • 当字段匹配时 - 结果是一些点数
    • 总结特定条件的点以计算行得分

例子:

select ...,
    case
      when name_first == @name_first then 100 --exact match
    else
      case
        when name_first like '%'+@name_first+'%' then 50 --partial match
      else
        0 --either @name_first is null or column does not match
      end
    end
    +
    case
      when sex == @sex then 150
    else
      0
    end
    +
    ...
    --when SSN matches add up a huge score such as 900
from <dataset>
  1. 最终结果将仅包含那些 score 高于某个最小数字(即 1)的行。

  2. 至于屏蔽 SSN,这很简单(在SELECT 子句中)

...
case when @social_security_number = social_security_number then
social_security_number else '-' end as social_security_number
...

我无法推断ScoreMax 之间的关系。出生日期字段需要更复杂的条件表达式。此外,分数是在子查询中计算还是交叉应用是如何以可读和高性能的方式编写所有必需条件的问题。提供的数据太少,无法提供任何有用的提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多