在mysql中查找具有开始和结束位置的子字符串

时间:2015-05-11 09:17:23

标签: mysql

我有以下数据集。

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。

有没有什么方法可以传递字符串的开始和结束位置,以便查询只查看有限的位置?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

substring_index是你的朋友。

select * 
  from table1
  where substring_index(substring_index(ivmsmessage, ',', -2), ',', 1) = 0

quick demo

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;