【问题标题】:Filter values in stored procedure on the basis of white spaces根据空格过滤存储过程中的值
【发布时间】:2014-07-07 03:14:46
【问题描述】:

假设我在Name 列中有 3 条记录,分别名为“问题”、“大问题”和“非常大问题”,并且我想在 stored procedure 中进行过滤。我的 SP 可以带一个参数,即@p,我想根据该参数查找记录。如果我得到参数,我就会发现“非常大的问题”

  1. VE(因为 'VERY' 以 'VE' 开头)
  2. BI(因为“BIG”以“BI”开头)
  3. PRO(因为 PROBLEM 以“PRO”开头)

一种解决方案可能是使用Where name like '%' + @p + '%',但它可能会产生不希望的结果,例如如果我搜索“Phil”并将参数指定为“Ph”,那么结果将是“Phil”和“Joseph”,因为两者都有“Ph”关键词。有什么解决办法吗?由于我正在使用ADO.NetC# 解决方案也值得赞赏。

我的目标

如果我搜索“VE”,那么如果我使用name like @p + '%',结果应该是“非常大的问题”,但同样的结果也应该出现在“VE”、“BI”和“PRO”上。这就像在空白处拆分值并匹配每个单词的结果。

我可以举个 C# 例子:

string name = 'VERY BIG PROBLEM';
string[] terms = name.Split(' ');

注意term 数组包含 3 个值;即“非常”、“大”和“问题”。

因此,如果我搜索“VE”、“BI”或“PRO”,它应该会得到相同的结果。如果仍然不清楚,假设我们要搜索板球运动员“Abraham Benjamin Devilliers”的名字。让我的参数是“Abrah”、“Benj”或“Dev”;它应该为我搜索“Abraham Benjamin Devilliers”。

【问题讨论】:

  • 不确定你想要什么 @p like '%' + @p +%?为什么要使用 @p 而不是 Name,因为记录存储在 Name 列中?
  • 已编辑,感谢您的关注。
  • 好的。现在,像“%PH%”这样的名称是什么意思,因为列名只有三个,VE、BI 和 PRO?请分享你的目标。你想达到什么目标?
  • 如果你只想匹配开头的字母,那么你必须尝试像@p + '%' 这样的东西。这可能会对您有所帮助。
  • 更新问题以使其更具描述性。

标签: asp.net sql stored-procedures ado.net


【解决方案1】:

如果您想像 @ankit 建议的那样搜索,可以使用 @p+'%' 之类的开头。

如果您想要一个不好的 c# 解决方案,因为您将获取更多数据然后过滤掉。您可以使用linq 过滤数据。

您可以在 linq 中使用StartsWith 来过滤数据
示例:-How to improve this LINQ query for search

编辑 1

您可以在or clouse 中组合两个条件

  (LIKE '%[^a-z]'+@p+'[^a-z]%') OR (LIKE @p +`%`)

参考:Search for “whole word match” with SQL Server LIKE pattern

你也可以使用

[MyColumn] Like '% '+  @p +' %' 
OR [MyColumn] Like '% '+ @p 
OR [MyColumn] Like ' %' 
OR [MyColumn] =  @p

编辑:另一种方法(仅适用于 ascii 字符)可能是:

'#'+[MyColumn]+'#' like '%[^a-z0-9]'+ @p+'[^a-z0-9]%'

参考Match only entire words with LIKE?

【讨论】:

  • 我在名称栏中有 3 个单词,如问题。应在任一单词的首字母上进行搜索。
  • 我在更新的问题中举了一个板球运动员名字的例子。不管你用名字、姓氏或中间名搜索。它应该给我结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2016-06-06
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多