2015-07-03 143 views
2

以下是问题 - 我有一个数据库列,其中包含用户填写的产品序列号,但没有任何类型的过滤器。例如,用户可以根据自己的解释将该字段填入:DC-538,DC 538或DC538,因为序列号通常在产品的金属部分,并且可能很难知道如果有空白例如空间。查询在非字母数字列中搜索字母数字字符串

我无法格式化当前列值,因为那么多品牌,我们无法确定如果取出非字母数字字符可能会导致问题。我的意思是,如果他们认为这些字符是官方号码的一部分。例如:“DC-538-XXX”和“DC538-XXX”可能与2种不同的产品有关。非常不可能,但我们不能认为它不会发生。

现在我需要通过我的网站上的序列号提供搜索......但是,如果用户搜索“DC538”而不是“DC 538”,他不会找到它。什么是最好的方法?

我相信完美的解决方案将有一种选择,将搜索确切的字符串,并从搜索词剥离非字母数字,并与数据库中的剥离字符串进行比较(我不喜欢没有)。但我不知道是否有办法只用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

+0

好的拉杜。我之前搜索过,但只是发现查询过滤或不alpha-non。我错过了你所说的其他答案。我会尝试你的解决方案,谢谢! – mEba

+0

我还没有测试解决方案,但计划是在这个星期做。我有点不安全,因为我从来没有在SQL中使用函数和变量。我的问题是..一旦我创建了一个函数,MS SQL保存它保存在某处以备后用,或者我应该在每次我想要执行查询时创建它。 THanks – mEba

+0

只是更新。完美的作品!谢谢! – mEba