代码之家  ›  专栏  ›  技术社区  ›  Dev 404

使用[text()]别名修剪XML查询中的逗号结尾

  •  0
  • Dev 404  · 技术社区  · 8 年前

    我有以下的 sql 我需要修剪尾逗号(如果它存在的话)。我是个业余爱好者 SQL语言 所以一点帮助/指导会很好。

    SELECT
        fse.FormSubmissionId,
        CASE
            WHEN fse.Type = 4
                THEN
                    (SELECT fse2.FormElementItemText + ', ' as [text()] 
                     FROM dbo.FormSubmissionElement as fse2 
                     WHERE fse2.FormElementId = fse.FormElementId 
                     ORDER BY fse2.FormElementItemText DESC 
                     FOR XML PATH(''))
        END as UserSubmission
    

    我环顾四周,找到了一些方法来删去结尾的逗号,比如 here here 是的。但我不知道如何把它融入我的当前 select 语句,因为别名是 [text()] 对于 XML 是的。

    我相信这很简单,但我很感激你的帮助。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Zohar Peled    8 年前

    如果在开头而不是结尾添加逗号,则可以使用 stuff 要删除它,如下所示:

    SELECT
    fse.FormSubmissionId,
    CASE
        WHEN fse.Type = 4
            THEN
                STUFF((SELECT ', ' +fse2.FormElementItemText as [text()] 
                       FROM dbo.FormSubmissionElement as fse2 
                       WHERE fse2.FormElementId = fse.FormElementId 
                       ORDER BY fse2.FormElementItemText DESC 
                       FOR XML PATH('')), 1, 2, '')
    END as UserSubmission
    

    原因是您知道字符串总是从索引1开始,但是要知道最后一个索引是什么,您必须执行两次select或使用一个变量。

        2
  •  1
  •   Lukasz Szozda    8 年前

    你可以重写为:

    SELECT
        fse.FormSubmissionId,
        CASE
           WHEN fse.Type = 4 THEN
           STUFF((SELECT ', ' + fse2.FormElementItemText as [text()]-- ', ' goes first
           FROM dbo.FormSubmissionElement as fse2 
           WHERE fse2.FormElementId = fse.FormElementId
           ORDER BY fse2.FormElementItemText DESC 
           FOR XML PATH('')
           ),1,2,'')    -- stuff will remove first 2 characters
    END as UserSubmission
    ...