【问题标题】:How to remove trailing characters with Transact-SQL (t-sql)?如何使用 Transact-SQL (t-sql) 删除尾随字符?
【发布时间】:2019-12-25 20:00:12
【问题描述】:

使用 transact-sql (t-sql) 我有一个字符串常量和三个字符串变量,我想在每个值之间用分号分隔符连接。三个字符串变量中的每一个有时都是空白或空值,这会产生我不想要的有一个、两个或三个分号分隔符的情况。

我尝试了根据 t-sql 网站应该可以工作的 Concat_ws() 函数,但我收到错误消息,指出函数名称无法识别。我尝试了两个带有 Replace() 函数的语句,其中我用空格替换了双分号或三重分号。这行得通,但看起来很粗糙,不会帮助我只替换一个尾随分号。有什么想法吗?

当 var 为空时产生过多分号的示例代码:

Concat('Label ', ';', var1, ';', var2, ';', var3) as Result

【问题讨论】:

  • Concat_ws() 已添加到 SQL Server 2017。
  • Concat_WS() 不适合我。给出错误。不知道我有什么版本的 t-sql,它是供应商软件的一部分。
  • Concat_WS 将跳过 null 的参数,但不是空字符串。您可以使用case 表达式(或iif)将null 替换为空字符串。提示:select @@Version; 将返回 SQL Server 的版本。
  • 请将您从SELECT @@VERSION 获得的结果添加到您的问题中。看来您正在运行 2017 年之前的版本。
  • 我会尝试一个 case 表达式或 iif。当我运行时选择@@Version;错误说必须删除标量变量@@Version。

标签: sql sql-server tsql delimiter trailing


【解决方案1】:

这里相当于 SQL Server 中的concat_ws():

stuff( coalesce(';' + nullif(var1, ''), '') + coalesce(';' + nullif(var2, ''), '') + coalesce(';' + nullif(var3, ''), ''), 1, 1, '') as Result

您可以在此结果前添加 'Label '。我不确定你是否真的想要在'Label ' 后面加分号,所以在concat_ws() 中也不合适。

【讨论】:

    【解决方案2】:

    为此,您只需在 CONCAT 语句中将 ';', @var# 更改为 ';'+@var#。

    DECLARE 
      @var1 VARCHAR(10) = 'abc',
      @var2 VARCHAR(10) = 'xyz',
      @var3 VARCHAR(10) = '123';
    
    SELECT CONCAT('Label ', ';'+@var1, ';'+@var2, ';'+@var3) as Result;
    

    对表:

    DECLARE 
      @v1 VARCHAR(10) = 'abc',
      @v2 VARCHAR(10) = 'xyz',
      @v3 VARCHAR(10) = '123';
    
    DECLARE @table TABLE (var1 VARCHAR(10),var2 VARCHAR(10),var3 VARCHAR(10));
    INSERT @table VALUES (@v1,@v2,NULL),(@v1,NULL,NULL),(@v1,NULL,@v3),(NULL,NULL,NULL)
    
    SELECT CONCAT('Label ', ';'+var1, ';'+var2, ';'+var3) as Result
    FROM @table;
    

    结果:

    Result
    ---------------------------------------
    Label ;abc;xyz
    Label ;abc
    Label ;abc;123
    Label 
    

    要处理空白,您可以使用 NULLIF(var#,'') 包装 var#。最终解决方案:

    DECLARE 
      @v1 VARCHAR(10) = 'abc',
      @v2 VARCHAR(10) = 'xyz',
      @v3 VARCHAR(10) = '123';
    
    DECLARE @table TABLE (var1 VARCHAR(10),var2 VARCHAR(10),var3 VARCHAR(10));
    INSERT @table VALUES (@v1,@v2,NULL),(@v1,NULL,NULL),(@v1,NULL,@v3),(NULL,NULL,NULL),
                         (@v1,@v2,''),(@v1,'',''),(@v1,'',@v3),(NULL,'',NULL);
    
    SELECT CONCAT('Label ', ';'+NULLIF(var1,''), ';'+NULLIF(var2,''), ';'+NULLIF(var3,'')) as Result
    FROM @table;
    

    结果:

    Result
    ---------------------------------------
    Label ;abc;xyz
    Label ;abc
    Label ;abc;123
    Label 
    Label ;abc;xyz
    Label ;abc
    Label ;abc;123
    Label 
    

    【讨论】:

      【解决方案3】:

      使用isnull():

      select
        concat('Label ', isnull(';' + var1, ''), isnull(';' + var2, ''), isnull(';' + var3, '')) as Result
      from tablename  
      

      请参阅demo。
      结果:

      > | Result       |
      > | :----------- |
      > | Label ;a;b;c |
      > | Label ;d;e   |
      > | Label ;f;g   |
      > | Label ;h;i   |
      > | Label ;j     |
      > | Label ;k     |
      > | Label ;l     |
      > | Label        |
      

      【讨论】:

        【解决方案4】:
            DECLARE @VAR1 VARCHAR(10)
            DECLARE @VAR2 VARCHAR(10)
            DECLAR  @VAR3 VARCHAR(10)
            DECLARE @VAR11 VARCHAR(10)
            DECLARE @VAR22 VARCHAR(10)
            DECLAR  @VAR33 VARCHAR(10)
        
            SET @VAR1 = …
            SET @VAR2 = … 
            SET @VAR3 = … 
        
        IF @VAR1 IS NOT NULL
        BEGIN
            SET @VAR11 = CONCAT(@VAR1,';')
        ELSE
        SET @VAR11 = ''
        
        IF @VAR2 IS NOT NULL 
        BEGIN
            SET @VAR22 = CONCAT(@VAR2,';')
        ELSE
        SET @VAR22 = ''
        
        IF @VAR3 IS NOT NULL
        BEGIN
            SET @VAR33 = CONCAT(@VAR2,';')
        ELSE 
        SET @VAR33 = ''
        
            Concat('Label ', ';', @var11, @var22, @var33) as Result
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-20
          相关资源
          最近更新 更多