SQL数据库中的搜索列忽略特殊字符

时间:2009-08-17 17:01:34

标签: sql sql-server sql-server-2005 search

是否有人知道是否可以针对SQL Server数据库中的列执行%LIKE%搜索,但是让它忽略列中的任何特殊字符?

所以,例如,如果我有一个名为“歌曲”的列,它们包含以下内容......


黑色或白色

没有睡觉,直到布鲁克林

船舶之歌

爸爸不要传道


如果用户搜索“没有睡觉直到布鲁克林”,那么我希望它返回一个匹配,即使他们忘记包含撇号。如果他们搜索“SOUL”,我也希望它返回第4行。我相信你明白了......

真的很感激任何帮助。

4 个答案:

答案 0 :(得分:10)

我会研究使用全文索引然后你可以使用FREETEXT和CONTAINS的强大功能进行搜索。

编辑:我仍然会考虑改进全文索引搜索,但是,从另一个答案开始,这是一个使用REPLACE的选项。

SELECT
    Artist,
    Title
FROM
    Songs
WHERE
    REPLACE(REPLACE(REPLACE(Artist, '#',''), '*', ''), '"', '') LIKE '%Keywords%'

答案 1 :(得分:1)

您将删除各种字符。单引号,双引号,连字符,点,逗号等。

您可以在where子句中使用正则表达式,并对clean值进行匹配。 Read more about regex within SQL here

至于想要返回SOUL第4行的艺术品。你需要一个数据结构来标记歌曲,你必须在标签上搜索匹配。我担心我们需要更多有关您数据结构的详细信息。

答案 2 :(得分:0)

使用TRANSLATE, UPPER, and TRIM

的组合

答案 3 :(得分:0)

这是一个老问题,但我只是偶然发现了它,并且还在处理歌曲名称,并希望扩展使用 REPLACE 的已接受答案。您可以创建一个您想要忽略的字符列表,并用任何语言创建一个简单的函数来生成快速的、不完整的、永无止境的 REPLACE 行。例如,在 Python 中:

def sanitize(db_field):
    special_chars = ['•', '"', "\\'", '*', ',']
    sanitized = "REPLACE({}, '{}', '')".format(db_field, special_chars.pop(0))
    for s in special_chars:
       sanitized = "REPLACE({}, '{}', '')".format(sanitized, s)
    return sanitized

诸如 sanitize("name") 之类的调用将返回

REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(name, '•', ''), '"', ''), '\'', ''), '*', ''), ',', '')

可以在您的查询中使用。刚写的,希望对大家有所帮助。