SQL Server 2017 新字符串函數


讀書筆記,整理自<SQL Server 2017 Developer's Guide>

字符串處理函數

STRING_SPLIT,

  • 是一個table valued function
  • 執行計划里Estimated Number of Rows is 50
  • compatibility level 130 以上

使用限制

  • 分隔符是單個字符
  • 返回1列
  • 返回的數據類型是string,即使是一串數字
select * from STRING_SPLIT('1,2,3,4',',')

select  string_agg(OrderID,',') from MoxyOrders

STRING_AGG

2017引入,把輸入值連起來,並在中間添加分隔符

輸入varchar, 輸出是varchar(8000)
輸入nvarchar(max),輸出nvarchar(max)
其他任何類型輸入(nvarchar, int, float, datetime...)輸出都是nvarchar(4000)

SELECT STRING_AGG (name, ',') AS dbs_as_csv FROM sys.databases;

--輸入也可以不是字符串類型的
SELECT STRING_AGG (database_id, ',') AS dbiss_as_csv FROM sys.databases;

--直接在master上面執行,會出現字符串長度的問題
SELECT STRING_AGG (name, ',') AS cols FROM sys.syscolumns; 
--輸入用NVARCHAR(MAX)就好了
SELECT STRING_AGG (CAST(name AS NVARCHAR(MAX)), ',') AS cols FROM sys.syscolumns;
STRING_AGG 中NULL值的處理

NULL值會被直接忽略掉

下面這兩句的output是一樣的

SELECT STRING_AGG(c,',') AS fav_city FROM (VALUES('Vienna'),('Lisbon')) AS T(c)
UNION ALL
SELECT STRING_AGG(c,',') AS fav_city FROM (VALUES('Vienna'),(NULL),('Lisbon')) AS T(c);
Within Group的用法

作用就是在使用STRING_AGG 拼字符串的時候給值排序,如下例

use [WideWorldImporters]

DECLARE @input VARCHAR(20) = '1059,1060,1061';
SELECT CustomerID, STRING_AGG(OrderID, ',') WITHIN GROUP(ORDER BY OrderID DESC) AS orderids
FROM Sales.Orders o
INNER JOIN STRING_SPLIT(@input,',') x ON x.value = o.CustomerID
GROUP BY CustomerID
ORDER BY CustomerID;

CONCAT_WS

拼字符串,第一個參數是分隔符,之后可以傳最多8000個參數用於連接字符串,會自動忽略null值

SELECT CONCAT_WS( ' - ', database_id, recovery_model_desc, containment_desc) AS DatabaseInfo
FROM sys.databases;

TRIM

刪除左右兩邊的空格,相當於原來的LTRIM(RTRIM( ))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM