2013-01-08 41 views
3

我有數據庫字段「clinicNo」和字段包含記錄,如1234A,2343B,9999Z ......如何在數據庫中查找只有一個字符與搜索字符串不同的記錄?

如果錯誤我用的不是「1234A」 1234B'的select語句,我想要得到一個結果集,其中包含只有一個字符不同於給定字符串(即,1234B以上)的臨牀號。字段可能包含以下值。 1234A,1235B,5433A,4444S,2978C 如果我使用'1235A'作爲選擇查詢,它應該給1234A和1235B作爲結果。

+0

你的行中總是有4個數字和1個字符? –

+0

實際上我的號碼格式有點複雜。例如,一個真正的診所編號:ABC/2013/1234(//) – priyanga

回答

0
SELECT * FROM TABLE 
WHERE ClinicNo like concat(LEFT(ClinicNo,4),'%') 
1

你可以使用SUBSTRING爲您列選擇,下面的示例中,返回'1235「A到Z」

select * from TableName WHERE SUBSTRING(clinicNo, 0, 5) LIKE '1235A' 
1

你在找什麼叫萊文斯坦距離算法。雖然有一個levenshtein function in PHP,你真的想在MySQL中做到這一點。

有兩種方法可以在MySQL中實現Levenshtein函數。首先是創建一個存儲功能,其操作非常類似於存儲事務,除了它具有不同的輸入和輸出。這對於小數據集來說很好,但對接近數千行的任何東西都有點緩慢。您可以在這裏找到更多信息:http://kristiannissen.wordpress.com/2010/07/08/mysql-levenshtein/

第二種方法是在C/C++中實現用戶定義函數並將其作爲共享庫(* .so文件)鏈接到MySQL中。該方法還使用STORED FUNCTION來調用庫,這意味着對於這個或第一個方法的實際查詢可能是相同的(提供兩個函數的輸入都是相同的)。你可以找到更多關於這種方法在這裏:http://samjlevy.com/2011/03/mysql-levenshtein-and-damerau-levenshtein-udfs/

有了這些方法之一,您的查詢會是這樣:

SELECT clinicNo FROM words WHERE levenshtein(clinicNo, '1234A') < 2; 

要記住,「門檻」值應在關係改變是很重要的原始單詞長度。最好以百分比的形式來考慮它,比如你的一半= 50%,「期限」的一半= 2。在你的情況下,你可能會尋找< 2的差異(即1個字符的差異) ,但你可以進一步考慮更多的錯誤。請參閱:Wikipedia: Levenshtein Distance

0

在一般的開發中,您可以使用像Levenshtein這樣的函數來找出兩個字符串之間的差異,並返回一些「他們有多相似」的數字。你可能想要的結果是最相似的。

要在MySQL中獲得Levenshtein,請閱讀this post

或者只是得到所有結果並使用the Levenshtein function of PHP

相關問題