我有以下数据集。
id | event_type | ivmsmessage
-----------------------------
1 | gps_report | n/a,22,n/a,0,100
2 | gps_report | n/a,22,n/a,5,90
我想要提取没有在' ivmsmessage'第四位的字段为零。所以最终的输出应该是
id | event_type | ivmsmessage
-----------------------------
2 | gps_report | n/a,22,n/a,0,100
我尝试使用locate()函数来查找所需的结果,但这也考虑了剩下的字符串。 这是我试过的locate()查询。
select id, even_type, ivmsmessage from live_events where locate(0, ivmsmessage,9) > 0;
生成以下结果。
id | event_type | ivmsmessage
-----------------------------
1 | gps_report | n/a,22,n/a,0,100
2 | gps_report | n/a,22,n/a,5,90
它也考虑了第二条记录,因为90年代为0。
有没有什么方法可以传递字符串的开始和结束位置,以便查询只查看有限的位置?
非常感谢任何帮助。
答案 0 :(得分:2)
substring_index
是你的朋友。
select *
from table1
where substring_index(substring_index(ivmsmessage, ',', -2), ',', 1) = 0
substring_index(string, delim, count)
会在count
delim
string
次出现count
次左侧的所有内容。如果substring_index('n/a,22,n/a,0,100', ',', -2)
为负数,它将为您提供右侧的所有内容,计数从右侧开始。将两者结合起来可以让我们对分隔字符串中的特定元素进行归零。
在此示例中,0,100
提供了substring_index('0,100', ',', 1)
,而0
提供了{{1}},然后我们会对其进行测试。
答案 1 :(得分:-1)
/*
--------------------------------------------------------------------------------
-- Function to return the Nth part from a delimited string
--------------------------------------------------------------------------------
*/
drop function if exists GetPart;
delimiter //
create function GetPart(str varchar(1024),delim char,count int) returns varchar(1024)
begin
if delim is null then
set delim = char(9);
end if;
if count > 0 then
return substring_index(substring_index(concat(str,delim),delim,count),delim,-1);
else
return substring_index(substring_index(concat(delim,str),delim,count),delim,1);
end if;
end;
//
delimiter ;
您可以使用上面的通用实用程序函数来获取任何字符串的第N部分。对于您的特定示例,它将类似于:
select id, event_type, ivmsmessage
from live_events
where GetPart(ivmsmessage,',',4) = 0;