如何使用 Transact-SQL (t-sql) 删除尾随字符?

How to remove trailing characters with Transact-SQL (t-sql)?

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

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

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

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

这里相当于 SQL 服务器中的 concat_ws()

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

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

使用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        |

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

DECLARE 
  @var1 VARCHAR(10) = 'abc',
  @var2 VARCHAR(10) = 'xyz',
  @var3 VARCHAR(10) = '123';

SELECT CONCAT('Label ', ';'+@var1, ';'+@var2, ';'+@var3) as Result;

反对 table:

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 
    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