搜索具有多种匹配类型的变量字段

时间:2017-01-25 19:21:20

标签: c# sql-server

问题:

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

这是搜索输入的显示方式: enter image description here

此搜索包括SSN: enter image description here

此搜索未包含SSN: enter image description here

详细信息:

  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似乎包含了#34; No Info"实际上它与搜索条件不符。
    4. 如果没有其他选择,我应该制定某种类型的评分方案吗?
    5. 否则,我不知道从哪里开始。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

  3. 对于要搜索的数据集中的每一行,将计算得分。确切的公式取决于您,但一般规则可能是

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

    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. 最终结果只包含那些提供得分高于某个最小数字(即1)的行。

    2. 至于屏蔽SSN,这就像(在SELECT子句中)

    3. 一样简单
      ...
      case when @social_security_number = social_security_number then
      social_security_number else '-' end as social_security_number
      ...
      

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