选择字符串不完全匹配的位置

时间:2012-10-21 00:00:34

标签: sql sql-like

这是我的表格行:

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

如您所见,text包含两种类型的数字,一种没有下划线,另一种包含下划线。

我想选择至少有一个没有下划线的数字的行(类型1)。像这样:(结果集)

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

(忽略3

怎么做? (我认为这可能是NOT LIKE,但我不知道怎么写)

3 个答案:

答案 0 :(得分:2)

你的电话号码可以多长时间?试试这个:

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

答案 1 :(得分:1)

您不能使用LIKE,但可以使用RLIKE,它使用正则表达式:

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

答案 2 :(得分:1)

以下查询计算字符串中逗号的数量,不同数字的数量可以计算为逗号数量的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

即。它返回存在至少一个数字而没有下划线的行。