如何在SQL Server的CASE语句中加入Unicode字符?

yptwkmov  于 2022-12-17  发布在  SQL Server
关注(0)|答案(3)|浏览(183)

我有一个类型为“nvarchar”的列,其中一些值包含特殊字符。我想要做的是,如果值以特殊字符开头,则执行一个函数以删除该字符,否则按原样返回值。示例数据如下:
| 识别号|金额|
| - ------|- ------|
| 1个|九九九点零九分|
| 第二章|三百三十九点五八至三百三十九点五八|
| 三个|二千一百四十一点一至二千零五十五点七二至三百五十七点六|
| 四个|五百一十九点三二元至五百一十九点三二元|
| 五个|六百六十一点八四至六百六十一点八四|
| 六个|八百四十三点五九元至八百四十三点五九元|
我尝试使用'STUFF'函数来替换一个特殊字符,只要一个值以它开头。

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

预期结果:

| 识别号|金额|试验|
| - ------|- ------|- ------|
| 1个|九九九点零九分|九百九十九点零九至九百九十九点零九|
| 第二章|三百三十九点五八至三百三十九点五八|三百三十九点五八至三百三十九点五八|
| 三个|二千一百四十一点一至二千零五十五点七二至三百五十七点六|二千一百四十一点一至二千零五十五点七二至三百五十七点六|
| 四个|五百一十九点三二元至五百一十九点三二元|五百一十九点三二至五百一十九点三二|
| 五个|六百六十一点八四至六百六十一点八四|六百六十一点八四至六百六十一点八四|
| 六个|八百四十三点五九元至八百四十三点五九元|八百四十三点五九至八百四十三点五九|
数据如下所示:

bt1cpqcv

bt1cpqcv1#

由于您的数据是数字或特殊字符,您可以只检查它 * 而不是 * 是一个数字:

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

shstlldc2#

可以按如下方式丢失 other 字符:

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;

输出:
| 金额|新编号|
| - ------|- ------|
| 三百三十九点五八英镑三百三十九点五八英镑|三百三十九点五八|
| 519.32英镑519.32英镑|29.312539.15美元|
| 六百六十一点八四英镑六百六十一点八四英镑|66.186468.14美元|
| 八百四十三点五九英镑八百四十三点五九英镑|93.549853.48美元|
| 999.09英镑999.09英镑|九九九九零。九九九九九零。九|
| 2141.1到2055.72到357.6之间|27357.6.55021.1421|
参见:DBFIDDLE
注意:NewNumber仍然不是数字!它只包含数字和/或.“”和/或,“”。

z9smfwbn

z9smfwbn3#

您可以使用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;

相关问题