您可以使用SUBSTRING() 函数来实现此目的,不过最好按照 cmets 中的建议更改模型。但是,这并不总是可能的,因此如果您必须使用这种格式,您可以使用以下内容:
SELECT
NOME,
PRICE,
SUM(CASE WHEN VEGETABLE LIKE '%Carrots%' THEN SUBSTRING(VEGETABLE , CHARINDEX(':', VEGETABLE , CHARINDEX('Carrots', VEGETABLE ))+1, 1) ELSE 0 END) as Carrots,
SUM(CASE WHEN VEGETABLE LIKE '%Banana%' THEN SUBSTRING(VEGETABLE , CHARINDEX(':', VEGETABLE , CHARINDEX('Banana', VEGETABLE ))+1, 1) ELSE 0 END) as Banana,
SUM(CASE WHEN VEGETABLE LIKE '%Watermelon%' THEN SUBSTRING(VEGETABLE , CHARINDEX(':', VEGETABLE , CHARINDEX('Watermelon', VEGETABLE ))+1, 1) ELSE 0 END) as Watermelon
FROM
Market
GROUP BY
NOME, PRICE
编辑:作为为什么这种模型是一个坏主意的完美论据,我上面的解决方案没有考虑多位数字。我提出了一个解决方案(如下),可以弥补这一点,但我将原始代码作为案例研究,以说明为什么字符串操作不好玩。
DECLARE @VEGETABLE VARCHAR(100) = '{Carrots:1000}|{Bananas:20}|{Watermelon:1}'
SELECT
SUM(CASE
WHEN @VEGETABLE LIKE '%Carrots%'
THEN SUBSTRING(
@VEGETABLE ,
CHARINDEX(':', @VEGETABLE , CHARINDEX('Carrots', @VEGETABLE ))+1,
CHARINDEX('}', @VEGETABLE , CHARINDEX('Carrots', @VEGETABLE )) - (CHARINDEX(':', @VEGETABLE , CHARINDEX('Carrots', @VEGETABLE ))+1))
ELSE 0 END) as Carrots,
SUM(CASE
WHEN @VEGETABLE LIKE '%Banana%'
THEN SUBSTRING(
@VEGETABLE ,
CHARINDEX(':', @VEGETABLE , CHARINDEX('Banana', @VEGETABLE ))+1,
CHARINDEX('}', @VEGETABLE , CHARINDEX('Banana', @VEGETABLE )) - (CHARINDEX(':', @VEGETABLE , CHARINDEX('Banana', @VEGETABLE ))+1))
ELSE 0 END) as Bananas,
SUM(CASE
WHEN @VEGETABLE LIKE '%Watermelon%'
THEN SUBSTRING(
@VEGETABLE ,
CHARINDEX(':', @VEGETABLE , CHARINDEX('Watermelon', @VEGETABLE ))+1,
CHARINDEX('}', @VEGETABLE , CHARINDEX('Watermelon', @VEGETABLE )) - (CHARINDEX(':', @VEGETABLE , CHARINDEX('Watermelon', @VEGETABLE ))+1))
ELSE 0 END) as Carrots