如何为MySQL中的每一行获取可变大小的子字符串?

时间:2012-02-28 16:31:58

标签: mysql sql substring

我有一个MySQL表,只是一个文本类型列,其中包含大量相同格式的信息,从这样的字符串开始:

Field1 : 1234
Field2 : Something

该列始终以 Field1 Field2 开头,但每个字段后的值对于每条记录都不同。

我需要的是获得 Field1 Field2 之后的值(在这种情况下 1234 Something) )在查询中, Field1 之后的值很容易,因为它总是4个字符长,但问题是 Field2 之后的值,因为它的大小各不相同记录,我到目前为止是这样的:

SELECT SELECT substring(substring_index(COLUMN,'Field1 : ',-1),1,4) as Field1_value
FROM table

我知道在 Field2 之后有一个换行符,所以我会考虑用 \ n 字符来划分我需要的值。

如何为每一行获取可变大小的子字符串?

P.S。是的,数据结构可怕,我无法改变它......

4 个答案:

答案 0 :(得分:2)

好吧,最后我明白了(感谢大家的贡献),这是最终的查询结果:

select substring(subcolumn, 9,5) as Field1, 
    substring(subcolumn,  24) as Field2 
    from (        
        select substring(COLUMN, 1, locate('\n',COLUMN,15)) as subcolumn
        from table
) as X

知道字符串“Field1:”和“Field2:”的大小,这会将这两个字符串及其后续值与列的其余部分隔离开,然后我使用子字符串(知道Field1之后的值总是4个字符长的帮助),子串中的15个是为了确保我看不到第二个换行符。

答案 1 :(得分:1)

提供动态值作为substring()的最后一个参数:

select 
   substring(your_column,
              length('FieldX : ')+1,
              length(your_column) - length('FieldX : ') + 1) as FieldX
from your_table;

这适用于FieldX中的任何一位数X.

答案 2 :(得分:1)

如果列的格式始终相同FieldX :,则:

SELECT 
     SUBSTRING(COLUMN, LOCATE(':', COLUMN)+2) as FieldValue
FROM table;

应该能满足您的需求。

基于澄清数据添加

如果您确实将数据与Field2值分开\n,则您的查询可能会变为:

SELECT
     SUBSTRING(COLUMN, LOCATE('Field1 : ', COLUMN)+9, 4) as Field1
     SUBSTRING(COLUMN, LOCATE('Field2 : ', COLUMN)+9, LOCATE(CHAR(10), COLUMN) - LOCATE('Field2 : ', COLUMN)+9) as Field2,
     SUBSTRING(COLUMN, LOCATE(CHAR(10), COLUMN)+1) as RestOfData
FROM table;

还有一些东西告诉我,无论你将这些数据返回到哪里,都应该能够更好地解析它。

答案 3 :(得分:1)

我认为最简单的是:

SELECT SUBSTRING( Column, 10 ) AS Field1_value
FROM table