是否有人知道是否可以针对SQL Server数据库中的列执行%LIKE%搜索,但是让它忽略列中的任何特殊字符?
所以,例如,如果我有一个名为“歌曲”的列,它们包含以下内容......
黑色或白色
没有睡觉,直到布鲁克林
船舶之歌
爸爸不要传道
如果用户搜索“没有睡觉直到布鲁克林”,那么我希望它返回一个匹配,即使他们忘记包含撇号。如果他们搜索“SOUL”,我也希望它返回第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)
答案 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, '•', ''), '"', ''), '\'', ''), '*', ''), ',', '')
可以在您的查询中使用。刚写的,希望对大家有所帮助。