![](/img/trans.png)
[英]How to incorporate a case statement into a query with an aggregate function
[英]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.09999.09')
, (2, N'339.58339.58')
, (3, N'2141.12055.72357.6')
, (4, N'519.32519.32')
, (5, N'661.84661.84')
, (6, N'843.59843.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.