SQL:在分隔符之间选择分隔符,在其他列中插入并删除字符串

时间:2016-10-24 07:07:54

标签: mysql sql delimiter

我没有为每组值设置一列,而是创建了一个名为&#34的列;数据"并使用这样的HTML:

<dt>Phone:</dt><dd>0 23 16/3 82 73 42 23</dd>
<dt>Phone:</dt><dd>0 21 61/81 26 73 13 22</dd>
<dt>Fax:</dt><dd>03 27/3 87 42 37 32</dd>
<dt>Website:</dt><dd>www.example.com</dd>

现在,我认识到,这并不是很聪明,我为每个值制作了一个专栏。我的新专栏名称为&#34; phone&#34;,&#34; phone2&#34;,&#34; fax&#34;和&#34;网站&#34;。

我需要一个SQL代码,例如选择分隔符<dt>Phone:</dt><dd></dd>之间的所有分隔符以及分隔符本身,将此字符串插入列&#34; phone&#34;并在&#34;数据&#34;中删除此字符串柱。 但我需要选择第一个字符串<dt>Phone:</dt><dd>0 23 16/3 82 73 42 23</dd>而不是第二个<dt>Phone:</dt><dd>0 21 61/81 26 73 13 22</dd>

任何人都可以给我一个如何做到这一点的提示吗?

1 个答案:

答案 0 :(得分:0)

要在<dt>Phone:</dt><dd></dd>之间选择数据,您可以使用SUBSTRING_INDEX。

喜欢这个

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(data, '</dd>', 1), '<dt>Phone:</dt><dd>', -1) as phone,
  SUBSTRING_INDEX(SUBSTRING_INDEX(data, '<dt>Phone:</dt><dd>', -1), '</dd>', 1) as phone2,
  SUBSTRING_INDEX(SUBSTRING_INDEX(data, '<dt>Fax:</dt><dd>', -1), '</dd>', 1) as fax,
  SUBSTRING_INDEX(SUBSTRING_INDEX(data, '<dt>Website:</dt><dd>', -1), '</dd>', 1) as website
from data_col;

更新

  

<dt>Phone:</dt>并不总是排在最前面。

如果&#34;数据&#34;中没有指定的数据顺序。专栏,试试这个:

SELECT
    IF (temp.f_phone > 0, SUBSTR(data, temp.f_phone + LENGTH('<dt>Phone:</dt><dd>'), f_phone_end - temp.f_phone - LENGTH('<dt>Phone:</dt><dd>')), null) as PHONE_1,
    IF (temp.s_phone > 0, SUBSTR(data, temp.s_phone + LENGTH('<dt>Phone:</dt><dd>'), s_phone_end - temp.s_phone - LENGTH('<dt>Phone:</dt><dd>')), null) as PHONE_2
  from data_col dc
JOIN (
  SELECT id, @f_phone:= LOCATE('<dt>Phone:</dt><dd>', data) as f_phone,
  LOCATE('</dd>', data, @f_phone+1) f_phone_end,
  @s_phone := LOCATE('<dt>Phone:</dt><dd>', data, @f_phone+1) as s_phone,
  LOCATE('</dd>', data, @s_phone+1) as s_phone_end
from data_col) temp ON temp.id = dc.id;

首先找到每个可能元素的起始位置(例如&#34;电话&#34;&#34;电话2&#34;)和结束标记<\dd>的位置。而不是使用SUBSTR从元素的起始位置+分隔符的长度,使用length = end_position - start_position - delimiter_length