簡體   English   中英

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

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

使用transact-sql(t-sql),我有一個字符串常量和三個字符串變量,我想用每個值之間的分號分隔符進行連接。 這三個字符串變量中的每一個有時都是空白或為null,這會導致出現我不希望使用一個,兩個或三個分號分隔符的情況。

我嘗試了應該根據t-sql網站工作的Concat_ws()函數,但是收到錯誤消息,提示無法識別的函數名。 我用Replace()函數嘗試了兩個語句,其中我用空格替換了雙或三分號。 那行得通,但看起來很粗糙,不會幫助我僅替換一個尾隨的分號。 有任何想法嗎?

當var為空白時,產生太多分號的示例代碼:

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

這等效於SQL Server中的concat_ws()

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

您可以在此結果前加上'Label ' 我不確定您是否真的要在'Label '之后加一個分號,所以在concat_ws()也不適合。

為此,您只需要在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 

使用isnull()

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

參見演示
結果:

> | Result       |
> | :----------- |
> | Label ;a;b;c |
> | Label ;d;e   |
> | Label ;f;g   |
> | Label ;h;i   |
> | Label ;j     |
> | Label ;k     |
> | Label ;l     |
> | 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM