2017-06-20 40 views
1

我目前正在與包括以下列格式字符串的數據工作的一個子SQL查詢:如何編寫選擇可變長度

"{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}" 

這個數據目前在一列,但我m試圖解析數據,以便最終結果是4個分隔列(Weight,Color,Variety和Expiration)。我嘗試使用SUBSTRING()函數,但由於每個部分的長度因行數而異,因此遇到了問題。你會建議使用不同的功能嗎?

+2

編輯與您正在使用的數據庫替換變量@Data你的問題和標籤。 –

+0

嗨戈登,道歉,如果這似乎是多餘的,但你想我標記我正在使用的數據?或者你是指別的東西? – Bp1490

+1

。 。爲您正在使用的數據庫添加標籤,如「mysql」,「sql-server」,「oracle」,「postgres」等。 –

回答

0

以下是MySQL。基於https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}', '}{Color: ', 1), 'Weight: ', -1) as Weight; 

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}', '}{Variety: ', 1), 'Color: ', -1) as Color; 

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}', '}{Expiration: ', 1), 'Variety: ', -1) as Variety; 

SELECT TRIM(TRAILING '}' from SUBSTRING_INDEX('{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}', 'Expiration: ', -1))as Expiration; 

在此基礎上的功能會更容易編寫插入到其他表或提取這些值。

DELIMITER $$ 
DROP FUNCTION IF EXISTS ExtractKeyValues $$ 
CREATE FUNCTION ExtractKeyValues(input text, Key_ varchar(50)) RETURNS VARCHAR(10) 
    DETERMINISTIC 
BEGIN 
    DECLARE res varchar(50); 

    Case 
     when key_ = 'Weight' THEN 
      SET res = SUBSTRING_INDEX(SUBSTRING_INDEX(input, '}{Color: ', 1), 'Weight: ', -1); 
     when Key_ = 'Color' THEN 
      SET res = SUBSTRING_INDEX(SUBSTRING_INDEX(input, '}{Variety: ', 1), 'Color: ', -1); 
     when key_ = 'Variety' THEN 
      SET res = SUBSTRING_INDEX(SUBSTRING_INDEX(input, '}{Expiration: ', 1), 'Variety: ', -1); 
     when key_ = 'Expiration' THEN 
      SET res = TRIM(TRAILING '}' from SUBSTRING_INDEX(input, 'Expiration: ', -1)); 
    END CASE; 

    RETURN (res); 
END; $$ 
Delimiter ; 

要使用此,我們可以這樣做:

select ExtractKeyValues('{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}', 'Weight'); 
select ExtractKeyValues('{Weight: 250g}{Color: RED}{Variety: Honeycrisp}{Expiration: Jun 15}', 'Color'); 
select ExtractKeyValues('{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}', 'Variety'); 
select ExtractKeyValues('{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}', 'Expiration'); 
+0

謝謝,這真的有幫助! – Bp1490

0

只需用數據

DECLARE @Data varchar(1000) 
SET @Data = '{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}' 

DECLARE @EndPos int 
SET @EndPos = CHARINDEX('}', @Data, 0) 
SELECT SUBSTRING(@Data, 9, @EndPos - 9) AS Weight 

SET @Data = SUBSTRING(@Data, @EndPos + 1, LEN(@Data)) 
SET @EndPos = CHARINDEX('}', @Data, 0) 
SELECT SUBSTRING(@Data, 8, @EndPos - 8) AS Color 


SET @Data = SUBSTRING(@Data, @EndPos + 1, LEN(@Data)) 
SET @EndPos = CHARINDEX('}', @Data, 0) 
SELECT SUBSTRING(@Data, 10, @EndPos - 10) AS Variety 

SET @Data = SUBSTRING(@Data, @EndPos + 1, LEN(@Data)) 
SET @EndPos = CHARINDEX('}', @Data, 0) 
SELECT SUBSTRING(@Data, 13, @EndPos - 13) AS Expiration