我有一个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。是的,数据结构可怕,我无法改变它......
答案 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