【问题标题】:How to search a table column without whitespace and punctuation如何搜索没有空格和标点符号的表列
【发布时间】:2014-01-07 08:35:01
【问题描述】:

我正在尝试在 sql server 2008 varchar 列上进行搜索,但删除了所有空格和标点符号

Query.Where(p => p.SearchName.Contains(searchInput)

例如搜索“ABC”将返回包含任何

的行
  1. ABC
  2. A B C
  3. A.B.C.

我曾尝试向我的表中添加一个包含已剥离数据的持久计算列,但收到一条错误消息,指出该表已在 ANSI_NULLS 设置为关闭的情况下创建,因此无法创建索引。

ALTER TABLE Example
ADD Name_Search AS dbo.RemoveNonAlphaNumericCharacters(Name)
PERSISTED

Msg 1935, Level 16, State 1, Line 1
Cannot create index. Object 'Example' was created with the following SET options off: 'ANSI_NULLS'.

我还有什么其他选择?

【问题讨论】:

    标签: sql-server-2008 linq-to-entities entity-framework-5


    【解决方案1】:

    最后,我采用的解决方案是创建一个新表 Example_Search 并运行数据迁移脚本以使用现有数据(约 70 万条记录)填充该表。我还在原始表上为任何新的/更新的数据创建了触发器。

    我创建了一个 UDF 来去除所有不需要的字符并用它填充一个索引列。

    -- Function to remove all whitespace and punctuation from string
    Create Function [dbo].[fn_RemoveNonAlphaNumericCharacters](@Temp VarChar(1000))
    Returns VarChar(1000)
    With Schemabinding
    AS
    Begin
    
    Declare @KeepValues as varchar(50)
    Set @KeepValues    = '%[^a-z0-9]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
    
    Return @Temp
    End
    GO
    
    ALTER TABLE Example_Search
    ADD Name_Search varchar(50) NOT NULL
    GO
    

    在我的 .Net 查询中,我将实体集合更改为这个新表,并从输入搜索词中删除了所有不需要的字符。

    var compareName = Regex.Replace(searchName, @"\W", string.Empty);
    
    query.Where(p => p.SearchNames.Any(n => n.NameSearch.Contains(compareName)));
    

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2012-09-22
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多