簡體   English   中英

如何在 SQL 服務器的 CASE 語句中加入 unicode 字符?

[英]How to incorporate unicode character in a CASE statement in SQL Server?

我有一列類型為“nvarchar”的列,其中一些值具有特殊字符。 我想要做的是,如果值以特殊字符開頭,則執行 function 刪除該字符,否則按原樣返回值。 樣本數據如下:

ID 數量
1個 999.09999.09
2個 339.58339.58
3個 2141.12055.72357.6
4個 519.32519.32
5個 661.84661.84
6個 843.59843.59

我嘗試使用“STUFF”function 來替換值以它開頭的特殊字符。 IE,

SELECT  ID,
        STUFF (Amount, 1, 1, '') AS Test,
FROM        table

我為個人價值而工作。

但是當我使用 CASE 語句將它應用於整個列時(因為所有值都不以特殊字符開頭),那么我無法將特殊字符合並到 LIKE 運算符中。 我嘗試了以下查詢:

SELECT  ID,
        CASE
            WHEN Amount LIKE N'%'
            THEN (STUFF (Amount, 1, 1, ''))
            ELSE Amount
        END AS Test,
        
FROM        table

預期結果:

ID 數量 測試
1個 999.09999.09 999.09999.09
2個 339.58339.58 339.58339.58
3個 2141.12055.72357.6 2141.12055.72357.6
4個 519.32519.32 519.32519.32
5個 661.84661.84 661.84661.84
6個 843.59843.59 843.59843.59

數據看起來像:

在此處輸入圖像描述

由於您的數據是數字或特殊字符,您可以檢查它是否不是數字:

case when Amount not like N'[0-9]%' then (Stuff (Amount, 1, 1, '')) else Amount end as Test

松開其他字符可以這樣做:

WITH nrs as (
    SELECT 1 as x 
    union all
    select x+1 from nrs where x<25
  ),
cte as 
        (select Amount,substring(Amount,1,1) as a from mytable
         union all
         select Amount,substring(Amount,x+1,1) as a
         from mytable
         cross apply nrs x)
select mytable.Amount, string_agg(a,'') as NewNumber
from mytable
inner join cte on cte.Amount = mytable.Amount and a<>''
where a between '0'and '9' or a='.' or a=','
group by mytable.Amount;

output:

數量 新號碼
?339.58?339.58 339.58339.58
?519.32?519.32 29.312539.15
?661.84?661.84 66.186468.14
?843.59?843.59 93.549853.48
?999.09?999.09 9990.99990.9
2141.1?2055.72?357.6 27357.6.55021.1421

參見: DBFIDDLE

注意: NewNumber仍然不是數字。 它僅包含數字和/或“,”和/或“.”。

您可以使用 TRIM - 對於 SQL Server 2019 及以下版本,TRIM 會刪除前導字符和尾隨字符。 對於 SQL Server 2022,您可以指定前導/尾隨/兩者:

樣本數據:

Declare @testData Table (ID int, Amount nvarchar(50));
 Insert Into @testData (ID, Amount)
 Values (1, N'999.09999.09')
      , (2, N'339.58339.58')
      , (3, N'2141.12055.72357.6')
      , (4, N'519.32519.32')
      , (5, N'661.84661.84')
      , (6, N'843.59843.59');

SQL 服務器 2017:

 Select *
      , Test = trim(N'' From td.Amount)
   From @testData td;

SQL 服務器 2022:

 Select *
      , Test = trim(leading N'' From td.Amount)
   From @testData td;

暫無
暫無

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

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