代码之家  ›  专栏  ›  技术社区  ›  Tom Hunter

字符串\u AGG的行为与预期不符

  •  14
  • Tom Hunter  · 技术社区  · 6 年前

    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
    

    2 回复  |  直到 6 年前
        1
  •  19
  •   Jeroen Mostert    5 年前

    STRING_AGG(x, <separator>) 相同,只要 x <separator> 是,并将它们与查询中的第一个计算表达式统一。

    一个解决方法是确保

    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