2012-10-21 41 views
1

這是我的錶行:選擇其中字符串不完全匹配

++ id ---- text ++++++++++++++ 
-- 1 ---- '90','80,'50' ----- 
-- 2 ---- '30','2','1_2' -- 
-- 3 ---- '10_2','5_3' ----- 

正如你看到的,text包含了2種類型號,一個沒有下劃線,另一樣。

我想選擇至少有一個數字而沒有下劃線(類型1)的行。事情是這樣的:

++ id ---- text ++++++++++++++ 
-- 1 ---- '90','80,'50' ----- 
-- 2 ---- '30','2','1_2' -- 

3被忽略)(結果集)

如何做到這一點? (我認爲這是可能的NOT LIKE,但我不知道怎麼寫)

回答

1

下面的查詢計數逗號的字符串中的編號,不同數字的數可以爲不是逗號的數目更多的作爲數字由逗號分隔計算,在字符串中下劃線的數:

select id, 
len(text) - len(replace(text,',','')) as count_of_commas, 
len(text) - len(replace(text,',','')) + 1 as count_of_number, 
len(text) - len(replace(text,'_','')) as count_of_underscore, 
len(text) - len(replace(text,',','')) + 1 - (len(text) - len(replace(text,'_',''))) as zero_if_no_number_without_underscore_exists 
from t1 

的上面的查詢給出了下列結果:

enter image description here

現在,使用上述查詢的邏輯,以下查詢可用於獲得所需的結果:

select * from t1 
where len(text) - len(replace(text,',','')) + 1 - (len(text) - len(replace(text,'_',''))) != 0 

即它返回行,其中ATLEAST一個數字不存在下劃線。

+0

謝謝!它的工作原理非常完美..(注意:'LEN'在MySQL 5.1中不存在,它被替換爲'LENGTH' ... – mrdaliri

1

你不能用LIKE做到這一點,但你可以用RLIKE,它使用正則表達式:

select * from mytable 
where `text` rlike "'\d+_\d+'" 
+0

謝謝,但它返回一個空的結果集.... – mrdaliri

+0

我認爲你的表達將選擇'2'和'3',但我想只要選擇'3' ... (在'3'中,所有數字都有下劃線,但在'2'中,有些不) – mrdaliri

2

您的號碼可能有多長?試試這個:

SELECT t1.id,t1.txt FROM t t1, t t2 WHERE t1.txt LIKE "%'__'%" AND t2.txt NOT LIKE "%\__',%" 
+0

1位和2位數字。 – mrdaliri