【问题标题】:Combining SQL string alias into comma delimited string将 SQL 字符串别名组合成逗号分隔的字符串
【发布时间】:2018-01-19 23:59:41
【问题描述】:

我正在处理这个存储过程,它检查哪些 BIT 字段是真实的,并根据它使用别名为其分配一个文本。我希望能够组合这些别名值(字符串)并将其以逗号分隔,以便我可以将其显示在我的 SSRS 报告中。 下面是我存储过程的一部分。

 ,CASE
  WHEN sr.[ReservationAlreadySentAttached] = 1 THEN 'Reservation Already Sent'
  END                           AS ReservationAttached

  ,CASE
  WHEN sr.[HPOfficeAttached] = 1 THEN 'H&P Office'
  END                           AS HPOfficeAttached

  WHEN sr.[NotesAttached] = 1 THEN 'Notes'
  END                           AS NotesAttached

  ,CASE
  WHEN sr.[OpPermitAttached] = 1 THEN 'Op Permit'
  END                           AS OpPermitAttached

  ,CASE
  WHEN sr.[TestResultsAttached] = 1 THEN 'Test Results'
  END                           AS TestResultsAttached

  ,CASE
  WHEN sr.[ConsultationReportsAttached] = 1 THEN 'Consultation Reports'
  END                           AS ConsultationReportsAttached

  ,CASE
  WHEN sr.[OtherAttached] = 1 THEN 'Other'
  END                           AS OtherAttached

因此,如果只有 NotesAttached 和 ReservationAlreadySentAttached 是真实的,那么我希望最终结果显示为 Notes,Reservation Already Sent。 我如何连接这些别名?

【问题讨论】:

    标签: sql sql-server-2008 stored-procedures reporting-services concatenation


    【解决方案1】:

    另一种选择是构建您的字符串,然后使用 STUFF() 删除前导逗号

    示例(缩写)

    Declare @YourTable table (ReservationAlreadySentAttached bit,HPOfficeAttached bit,NotesAttached bit)
    Insert Into @YourTable values
    (1,0,1)
    
    Select NewValue = stuff(
                       case when ReservationAlreadySentAttached = 1 then ', Reservation Already Sent' else '' end
                      +case when HPOfficeAttached               = 1 then ', H&P Office'               else '' end
                      +case when NotesAttached                  = 1 then ', Notes'                    else '' end
                      ,1,2,'')
     From  @YourTable
    

    退货

    NewValue
    Reservation Already Sent, Notes
    

    编辑 - 只是表达

     NewValue = stuff(
                       case when sr.[ReservationAlreadySentAttached] = 1 then ', Reservation Already Sent' else '' end
                      +case when sr.[HPOfficeAttached]               = 1 then ', H&P Office'               else '' end
                      +case when sr.[NotesAttached]                  = 1 then ', Notes'                    else '' end
                      ,1,2,'')
    

    【讨论】:

    • 我被你的回答卡住了@John Cappelletti。为什么我需要声明一个表?我只是想要一个与我的别名连接的字符串
    • @HereToLearn_ (at)YourTable 只是一个用于演示/说明的表变量。删除 SELECT 上面的所有内容(前 3 行)并将 (at)YourTable 更改为您的表名
    • @HereToLearn_ 用“只是表达”更新了答案
    • 好酷。感谢您的快速回复! 1,2 是什么意思?我打算在括号内再添加 4 个案例。我还需要更新什么吗?
    • @HereToLearn_ Stuff() 将从位置 1 开始的字符替换为 2 个空格的 ''... 从而消除前导 ,{space}
    【解决方案2】:
    CASE
      WHEN sr.[ReservationAlreadySentAttached] = 1 THEN ', Reservation Already Sent' ELSE ''
      END  
    + CASE
      WHEN sr.[HPOfficeAttached] = 1 THEN ', H&P Office' ELSE ''
      END                        
    + CASE etc...
    

    并将其包装在某个函数中以删除第一个逗号 + 空格。

    【讨论】:

    • 如果没有 ELSE,您将面临连接 NULL 的风险
    • 问题@TabAlleman。我在哪里定义将具有最终串联字符串列表的变量字符串?
    • 如果你想填充一个变量,那么你可以把它放在列定义之前,比如@MyVariable=STUFF(CASE WHEN...
    【解决方案3】:

    不是最漂亮的解决方案...

    RIGHT((CASE 
            WHEN sr.[ReservationAlreadySentAttached] = 1
                THEN ',Reservation Already Sent'
            END + CASE 
            WHEN sr.[HPOfficeAttached] = 1
                THEN ',H&P Office'
            END + CASE 
            WHEN sr.[NotesAttached] = 1
                THEN ',Notes'
            END + CASE 
            WHEN sr.[OpPermitAttached] = 1
                THEN ',Op Permit'
            END + CASE 
            WHEN sr.[TestResultsAttached] = 1
                THEN ',Test Results'
            END + CASE 
            WHEN sr.[ConsultationReportsAttached] = 1
                THEN ',Consultation Reports'
            END + CASE 
            WHEN sr.[OtherAttached] = 1
                THEN ',Other'
            END)
    ,LEN(CASE 
            WHEN sr.[ReservationAlreadySentAttached] = 1
                THEN ',Reservation Already Sent'
            END + CASE 
            WHEN sr.[HPOfficeAttached] = 1
                THEN ',H&P Office'
            END + CASE 
            WHEN sr.[NotesAttached] = 1
                THEN ',Notes'
            END + CASE 
            WHEN sr.[OpPermitAttached] = 1
                THEN ',Op Permit'
            END + CASE 
            WHEN sr.[TestResultsAttached] = 1
                THEN ',Test Results'
            END + CASE 
            WHEN sr.[ConsultationReportsAttached] = 1
                THEN ',Consultation Reports'
            END + CASE 
            WHEN sr.[OtherAttached] = 1
                THEN ',Other'
            END) - 1 )
    

    编辑:当 NONE 为 1 时,您可能必须考虑到,这样您就不会得到 Invalid length parameter passed to the right function.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      相关资源
      最近更新 更多