2012-02-28 19 views
4

我有只是有大量的信息以相同的格式,從這樣的字符串中的一個文本類型列一個MySQL表:如何獲得MySQL中每一行可變大小的子字符串?

Field1 : 1234 
Field2 : Something 

列始終與字段1字段2開始,但每個字段後的值對於每條記錄都不相同。

我需要的是得到的是以後有什麼字段1字段2上查詢(在這種情況下和東西),字段1後的值是容易的,因爲它是隻值長總是4個字符,但問題是,因爲它的大小爲每個記錄變化後字段2的人,我有什麼到目前爲止是這樣的:

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

我知道字段2的值有一個換行符,所以我會考慮考慮\ n字符來劃定我需要的值。

如何獲得每行可變大小的子字符串?

P.S.是數據結構可怕的,我不能改變它......

+6

你確實意識到你的數據是非常結構化的,不是嗎? – 2012-02-28 16:36:30

+1

我的確如此,就是這樣,不幸的是我無法改變它。 – DarkAjax 2012-02-28 16:37:54

+0

您希望在查詢中執行字符串操作的任何原因,而不是將您的數據返回到哪裏? – Karlson 2012-02-28 16:44:55

回答

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是爲了確保我看起來不是第二個換行符。

+2

'substring(COLUMN,1,locate('\ n',COLUMN,15))''可以簡化爲'SUBSTRING_INDEX(COLUMN,'\ n',2)' – 2012-02-28 20:49:32

+0

確實,謝謝ypercube ... – DarkAjax 2012-02-28 21:10:27

1

供應動態值的字符串()的最後一個參數:

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

這將任何單位工作X在FieldX中。

+0

這並沒有得到我期望的Field2的情況,字符串的大小** FieldX :**始終是相同的,問題是我不知道在** Field2之後會發生什麼**:(也不是長度) – DarkAjax 2012-02-28 17:08:19

+0

上述查詢不需要知道「Field2:」後面會發生什麼。相反,它會從每個單獨記錄中的字段長度中減去「字段2:」的長度。它動態地做到這一點,所以你不需要知道「場地2:」後面會發生什麼。也許我誤解了你的問題?讓我知道當您運行查詢時會發生什麼。 – aingram 2012-02-28 17:57:16

+0

對不起,我猜這裏的問題是我沒有很好地解釋自己,我想要的結果是後面的任何內容「Field2:」 – DarkAjax 2012-02-28 17:59:23

1

如果列的格式總是相同的FieldX :則:

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

應該給你你需要什麼。

增加了一個基於澄清DATA

如果你確實有通過\nField2值隔開數據,那麼你的查詢可以成爲:

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; 

東西還告訴我,不管你把這些信息返回到應該能夠更好地解析它。

+0

你錯過了列名稱在LOCATE()中,並且輸出結果如下所示: ield1:1234 Field2:Somethin DarkAjax 2012-02-28 20:34:39

+0

您是對的。糾正。 – Karlson 2012-02-28 21:49:19

1

我認爲最簡單的是:

SELECT SUBSTRING(Column, 10) AS Field1_value 
FROM table 
+0

在「Field1:」後返回所有內容 – DarkAjax 2012-02-28 20:35:06

+0

@darkajax:這就是你想要的,不是嗎? – 2012-02-28 20:35:49

+0

嗯,不完全是,我想要的是** Field1 **和** Field2 **之間的任何內容,以及** Field2 **和列的下一部分(換行前)之間的任何內容 – DarkAjax 2012-02-28 20:40:34

相關問題