2015-07-03 111 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