Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为MySQL中的每一行获取大小可变的子字符串?_Mysql_Sql_Substring - Fatal编程技术网

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

如何为MySQL中的每一行获取大小可变的子字符串?,mysql,sql,substring,Mysql,Sql,Substring,我有一个MySQL表,其中只有一个文本类型的列,包含大量相同格式的信息,以如下字符串开头: Field1 : 1234 Field2 : Something 列始终以字段1和字段2开头,但每个字段后面的值对于每个记录都不同 我需要的是在查询中只获取Field1和Field2之后的值(在本例中为1234和某物),而Field1之后的值很容易,因为它总是4个字符长,但问题是第2个字段之后的问题,因为每个记录的大小都不同,到目前为止,我得到的是: SELECT SELECT substring(su

我有一个MySQL表,其中只有一个文本类型的列,包含大量相同格式的信息,以如下字符串开头:

Field1 : 1234
Field2 : Something
列始终以字段1字段2开头,但每个字段后面的值对于每个记录都不同

我需要的是在查询中只获取Field1Field2之后的值(在本例中为1234某物),而Field1之后的值很容易,因为它总是4个字符长,但问题是第2个字段之后的问题,因为每个记录的大小都不同,到目前为止,我得到的是:

SELECT SELECT substring(substring_index(COLUMN,'Field1 : ',-1),1,4) as Field1_value
FROM table
我知道在字段2的值之后有一个换行符,所以我会考虑使用\n字符来定义我需要的值

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


是的,数据结构糟糕,我无法更改它…

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


这将适用于字段X中的任何一位X。

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

SELECT 
     SUBSTRING(COLUMN, LOCATE(':', COLUMN)+2) as FieldValue
FROM table;
应该给你你需要的

根据澄清的数据添加

如果您的数据实际上是通过
\n
字段2
值中分离出来的,那么您的查询可以变成:

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;

有些东西仍然告诉我,无论你将这些数据返回到什么地方,都应该能够更好地解析它。

我认为最简单的方法是:

SELECT SUBSTRING( Column, 10 ) AS Field1_value
FROM table
好的,最后我得到了它(感谢大家的贡献),这是最终的查询结果:

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是为了确保我不寻找第二个换行符。

您确实意识到您的数据结构非常糟糕,不是吗?我确实意识到,事实就是这样,不幸的是,我无法更改它。您为什么要在查询中执行字符串操作,而不是将数据返回到何处?这是一个非常严格的系统的一部分,因此在这种情况下,这不是一个选项(如果我的第一个选项是使用Perl),而在Field2的情况下,这并不是我所期望的,字符串FieldX:的大小总是一样的,问题是我不知道Field2后面是什么:(也不知道长度)上面的查询不需要知道“Field2:”后面是什么。相反,它从每个记录的字段长度中减去“字段2:”的长度。它动态地执行此操作,所以您不需要知道“字段2:”之后会发生什么。也许我误解了你的问题?让我知道当你运行查询时会发生什么。对不起,是的,我想这里的问题是我没有很好地解释自己,我想要的结果是“Field2:”之后的结果。请运行上面的查询,如果它没有提供你所需的,请让我知道。它没有,我使用的是“Field2:”,它在Field1之后显示2个字符,然后,列上的所有其他内容在LOCATE()中缺少列名,这会输出到以下内容:ield1:1234 Field2:something这会返回“Field1:@darkajax:这就是您想要的,不是吗?嗯,不完全是,我想要的是字段1和字段2之间的任何内容,以及字段2和专栏的下一部分之间的任何内容(换行前),我现在看到你的答案了。你把所有的文本都放在一个字段里。从描述来看,这一点并不明显……我猜您在
1234
之后和
Field2:
之前还有另一个换行符:子字符串(列,1,locate('\n',列,15))可以简化为
子字符串索引(列,'\n',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