我目前正在與包括以下列格式字符串的數據工作的一個子SQL查詢:如何編寫選擇可變長度
"{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}"
這個數據目前在一列,但我m試圖解析數據,以便最終結果是4個分隔列(Weight,Color,Variety和Expiration)。我嘗試使用SUBSTRING()
函數,但由於每個部分的長度因行數而異,因此遇到了問題。你會建議使用不同的功能嗎?
我目前正在與包括以下列格式字符串的數據工作的一個子SQL查詢:如何編寫選擇可變長度
"{Weight: 250g}{Color: Red}{Variety: Honeycrisp}{Expiration: Jun 15}"
這個數據目前在一列,但我m試圖解析數據,以便最終結果是4個分隔列(Weight,Color,Variety和Expiration)。我嘗試使用SUBSTRING()
函數,但由於每個部分的長度因行數而異,因此遇到了問題。你會建議使用不同的功能嗎?
以下是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');
謝謝,這真的有幫助! – Bp1490
只需用數據
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
編輯與您正在使用的數據庫替換變量@Data你的問題和標籤。 –
嗨戈登,道歉,如果這似乎是多餘的,但你想我標記我正在使用的數據?或者你是指別的東西? – Bp1490
。 。爲您正在使用的數據庫添加標籤,如「mysql」,「sql-server」,「oracle」,「postgres」等。 –