我有以下查询:
WITH cteCountryLanguageMapping AS (
SELECT * FROM (
VALUES
('Spain', 'English'),
('Spain', 'Spanish'),
('Sweden', 'English'),
('Switzerland', 'English'),
('Switzerland', 'French'),
('Switzerland', 'German'),
('Switzerland', 'Italian')
) x ([Country], [Language])
)
SELECT
[Country],
CASE COUNT([Language])
WHEN 1 THEN MAX([Language])
WHEN 2 THEN STRING_AGG([Language], ' and ')
ELSE STRING_AGG([Language], ', ')
END AS [Languages],
COUNT([Language]) AS [LanguageCount]
FROM cteCountryLanguageMapping
GROUP BY [Country]
我原本期望瑞士的语言栏内的值是逗号分隔的,例如:
| Country | Languages | LanguageCount
--+-------------+-------------------------------------------+--------------
1 | Spain | Spanish and English | 2
2 | Sweden | English | 1
3 | Switzerland | French, German, Italian, English | 4
但我得到了以下输出(4个值由and
隔开):
| Country | Languages | LanguageCount
--+-------------+-------------------------------------------+--------------
1 | Spain | Spanish and English | 2
2 | Sweden | English | 1
3 | Switzerland | French and German and Italian and English | 4
我错过了什么?
这是另一个例子:
SELECT y, STRING_AGG(z, '+') AS STRING_AGG_PLUS, STRING_AGG(z, '-') AS STRING_AGG_MINUS
FROM (
VALUES
(1, 'a'),
(1, 'b')
) x (y, z)
GROUP by y
| y | STRING_AGG_PLUS | STRING_AGG_MINUS
--+---+-----------------+-----------------
1 | 1 | a+b | a+b
这是SQL Server中的一个错误吗?
CASE COUNT([Language]) WHEN 1234567 THEN STRING_AGG([Language], ' and ') ELSE STRING_AGG([Language], ', ') END AS [Languages]
(使用1234567
案例)和CASE COUNT([Language]) WHEN 1234567 THEN STRING_AGG([Language], ' and ') END AS [Languages]
(省略ELSE
-- 现在匹配失败,表达式变成了NULL
)。无论“正确”的结果应该是什么,肯定不是这个。 - Jeroen MostertSTRING_AGG
调整的。如果将ELSE
更改为'blargh' + STRING_AGG(...)
,则会得到'blarghFrench and German...
,因此它不正确地将第二个STRING_AGG
与第一个统一起来。最简单的解决方法是将ELSE
表达式更改为STRING_AGG([Language] + '', ', ')
-- 这样可以避免 CSE,表明 CSE 忽略了STRING_AGG
的第二个参数,从而暗示存在一个 bug。 - Jeroen Mostert