以下是问题 - 我有一个数据库列,其中包含用户填写的产品序列号,但没有任何类型的过滤器。例如,用户可以填写以下字段:DC-538,DC 538或DC538,具体取决于他自己的解释 - 因为序列号通常位于产品的金属部分,并且很难知道如果有&#39 ;例如,一个空白区域。
我无法格式化当前列值,因为这是很多品牌,我们无法确切知道如果取出非字母数字字符会导致问题。我的意思是,如果他们将这些角色视为官方号码的一部分。例如:" DC-538-XXX"和" DC538-XXX"可能与2种不同的产品有关。非常不可能,但我们不能认为它不会发生。
现在我需要在我的网站上按序列号提供搜索...但是,如果用户搜索" DC538"而不是" DC 538"他找不到它。什么是最好的方法?
我相信完美的解决方案是有一种选择能够搜索确切的字符串,并从搜索词中删除非alpha-num并与数据库中的剥离字符串进行比较(我不会# 39; t)。但我不知道如果只有SQL的方法可以做到这一点。
有什么想法吗?
干杯
答案 0 :(得分:1)
使用以下功能,该功能以 answer here 的形式提供,并将其修改为返回数字字符:
CREATE FUNCTION [dbo].[RemoveNonAlphaCharacters] (@Temp VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @KeepValues AS VARCHAR(MAX)
SET @KeepValues = '%[^a-z0-9]%'
WHILE PatIndex(@KeepValues, @Temp) > 0
SET @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
RETURN @Temp
END
您可以执行以下操作:
DECLARE Input NVARCHAR(MAX)
SET @Input = '%' + dbo.RemoveNonAlphaCharacters('text inputted by user') + '%'
SELECT *
FROM Table
WHERE dbo.RemoveNonAlphaCharacters(ColumnCode) LIKE @Input
以下是一个工作 SQLFiddle
的示例