Microsoft SQL Server 2022 已經(jīng)正式發(fā)布,可以下載使用。本文給大家介紹一下該版本中的部分 T-SQL 新功能。
窗口函數(shù)增強(qiáng)
新版本中的窗口函數(shù)支持命名窗口(WINDOW)子句,可以利用該子句定義窗口變量,然后在 OVER 子句中使用該窗口變量。
舉例說明(示例腳本):
SELECT d.dept_name AS "部門名稱", e.emp_name AS "姓名", e.salary AS "月薪",
ROW_NUMBER() OVER w AS "row_number",
RANK() OVER w AS "rank",
DENSE_RANK() OVER w AS "dense_rank",
PERCENT_RANK() OVER w AS "percent_rank"
FROM employee e
JOIN department d ON (e.dept_id = d.dept_id)
WINDOW w AS (PARTITION BY e.dept_id ORDER BY e.salary DESC);
部門名稱 |姓名 |月薪 |row_number|rank|dense_rank|percent_rank |
-----+---+--------+----------+----+----------+-------------------+
行政管理部|劉備 |30000.00| 1| 1| 1| 0.0|
行政管理部|關(guān)羽 |26000.00| 2| 2| 2| 0.5|
行政管理部|張飛 |24000.00| 3| 3| 3| 1.0|
人力資源部|諸葛亮|24000.00| 1| 1| 1| 0.0|
人力資源部|黃忠 | 8000.00| 2| 2| 2| 0.5|
人力資源部|魏延 | 7500.00| 3| 3| 3| 1.0|
...
示例使用 WINDOW 子句定義了一個窗口變量 w,然后在 4 個窗口函數(shù)的 OVER 子句中使用了該變量。這種使用窗口變量的寫法可以簡化窗口選項的輸入。
新增的 WINDOW 子句還支持其他用法,具體可以查看官方文檔。
IS DISTINCT FROM
IS [NOT] DISTINCT FROM 的作用是判斷兩個表達(dá)式是否相同,它們支持 NULL 值的比較。例如:
CREATE TABLE test(id INT);
INSERT INTO test VALUES(100);
SELECT *
FROM test
WHERE 1 IS NOT DISTINCT FROM 1;
id |
---+
100|
SELECT *
FROM test
WHERE 1 IS NOT DISTINCT FROM 2;
id|
--+
SELECT *
FROM test
WHERE NULL IS NOT DISTINCT FROM NULL;
id |
---+
100|
SELECT *
FROM test
WHERE NULL = NULL;
id|
--+
注意,IS NOT DISTINCT FROM 的作用類似于 =,IS DISTINCT FROM 的作用類似于 !=,具體說明參考官方文檔。
時間序列函數(shù)
新增 DATE_BUCKET() 函數(shù),用于返回從指定時間點(diǎn)開始,以固定日期時間間隔為存儲桶的每個起始日期時間。例如:
DECLARE @date DATETIME2 = '2022-11-20 21:22:11';
DECLARE @orign DATETIME2 = '2022-11-01 00:00:00';
SELECT DATE_BUCKET(WEEK, 1, @date, @orign);
|
-----------------------+
2022-11-15 00:00:00.000|
SELECT DATE_BUCKET(WEEK, 2, @date, @orign);
|
-----------------------+
2022-11-15 00:00:00.000|
SELECT DATE_BUCKET(WEEK, 3, @date, @orign);
|
-----------------------+
2022-11-01 00:00:00.000|
從 2022-11-01 00:00:00 開始,以 1 或者 2 周為存儲桶計算,包含 2022-11-20 21:22:11 的存儲桶的起始日期為 2022-11-15 00:00:00。如果以 3 周為存儲桶計算,包含 2022-11-20 21:22:11 的存儲桶的起始日期為 2022-11-01 00:00:00。
新增 GENERATE_SERIES() 函數(shù),可以用于生成數(shù)字序列,例如:
SELECT value FROM GENERATE_SERIES(1, 5);
value
-----------
1
2
3
4
5
SELECT value FROM GENERATE_SERIES(10, 1, -2);
value
-----------
10
8
6
4
2
另外,以下窗口函數(shù)支持 IGNORE NULLS 和 RESPECT NULLS 選項,分別表示計算時忽略或者考慮 NULL 值:
- FIRST_VALUE()
- LAST_VALUE()
JSON 函數(shù)增強(qiáng)
新版本中的 ISJSON() 函數(shù)增加了一個可選參數(shù):
ISJSON ( expression [, json_type_constraint] )
參數(shù) json_type_constraint 用于指定要測試的 JSON 類型,包括 VALUE、ARRAY、OBJECT 或 SCALAR。例如:
SELECT ISJSON('true', VALUE);
SELECT ISJSON('test string', VALUE);
新增 JSON_PATH_EXISTS() 函數(shù),可以用于檢查 JSON 字符串中是否存在指定的 SQL/JSON 路徑。例如:
DECLARE @jsonInfo NVARCHAR(MAX)
SET @jsonInfo=N'{"info":{"address":[{"town":"Paris"},{"town":"London"}]}}';
SELECT JSON_PATH_EXISTS(@jsonInfo,'$.info.address'); -- 1
新增 JSON_OBJECT() 函數(shù),用于構(gòu)造 JSON 對象。例如:
SELECT JSON_OBJECT('name':'value', 'type':1);
{"name":"value","type":1}
新增 JSON_ARRAY() 函數(shù),用于構(gòu)造 JSON 數(shù)組。例如:
SELECT JSON_ARRAY('a', JSON_OBJECT('name':'value', 'type':1));
["a",{"name":"value","type":1}]
聚合函數(shù)增強(qiáng)
新增 APPROX_PERCENTILE_CONT() 以及 APPROX_PERCENTILE_DISC() 函數(shù),可以返回一組數(shù)據(jù)中的近似百分位數(shù)。
對于大型數(shù)據(jù)集,它們可以用作 PERCENTILE_CONT 以及 PERCENTILE_DISC 的替代方法,與響應(yīng)時間較慢的準(zhǔn)確百分位值相比,可以接受可忽略的錯誤和較快的響應(yīng)。
T-SQL 函數(shù)增強(qiáng)
新增 GREATEST() 以及 LEAST(),分別用于返回一個或多個參數(shù)中的最大值以及最小值。例如:
SELECT GREATEST?(?'6.62', 3.1415, N'7'?)?AS?GreatestVal,
LEAST?(?'6.62', 3.1415, N'7'?)?AS?LeastVal;
GreatestVal|LeastVal|
-----------+--------+
7.0000| 3.1415|
STRING_SPLIT() 函數(shù)支持一個額外的可選參數(shù),可以為拆分后的每個字符串返回一個序號。例如:
SELECT * FROM STRING_SPLIT('SQL Server 2022', ' ', 1);
value |ordinal|
------+-------+
SQL | 1|
Server| 2|
2022 | 3|
新增 DATETRUNC() 函數(shù),可以對日期時間數(shù)據(jù)進(jìn)行截斷。例如:
DECLARE @d datetime2 = '2021-12-08 11:30:15.1234567';
SELECT 'Year', DATETRUNC(year, @d);
SELECT 'Quarter', DATETRUNC(quarter, @d);
SELECT 'Month', DATETRUNC(month, @d);
SELECT 'Week', DATETRUNC(week, @d); -- Using the default DATEFIRST setting value of 7 (U.S. English)
SELECT 'Iso_week', DATETRUNC(iso_week, @d);
SELECT 'DayOfYear', DATETRUNC(dayofyear, @d);
SELECT 'Day', DATETRUNC(day, @d);
SELECT 'Hour', DATETRUNC(hour, @d);
SELECT 'Minute', DATETRUNC(minute, @d);
SELECT 'Second', DATETRUNC(second, @d);
SELECT 'Millisecond', DATETRUNC(millisecond, @d);
SELECT 'Microsecond', DATETRUNC(microsecond, @d);
Year 2021-01-01 00:00:00.0000000
Quarter 2021-10-01 00:00:00.0000000
Month 2021-12-01 00:00:00.0000000
Week 2021-12-05 00:00:00.0000000
Iso_week 2021-12-06 00:00:00.0000000
DayOfYear 2021-12-08 00:00:00.0000000
Day 2021-12-08 00:00:00.0000000
Hour 2021-12-08 11:00:00.0000000
Minute 2021-12-08 11:30:00.0000000
Second 2021-12-08 11:30:15.0000000
Millisecond 2021-12-08 11:30:15.1230000
Microsecond 2021-12-08 11:30:15.1234560
LTRIM() 以及 RTRIM() 函數(shù)支持一個額外的可選參選,可以指定要刪除的字符。例如:
SELECT LTRIM('123abc.' , '123.'), RTRIM('.123abc.' , 'abc.');
| |
----+----+
abc.|.123|
TRIM() 函數(shù)可以選擇從字符串的開頭和/或末尾刪除空格字符或其他指定字符。例如:
SELECT TRIM(LEADING '-' FROM '---SQL Server 2022---') AS lead,
TRIM(TRAILING '-' FROM '---SQL Server 2022---') AS trail,
TRIM(BOTH '-' FROM '---SQL Server 2022---') AS both;
lead |trail |both |
------------------+------------------+---------------+
SQL Server 2022---|---SQL Server 2022|SQL Server 2022|
位操作函數(shù)
新增,LEFT_SHIFT() 函數(shù)以及 << 運(yùn)算符,用于實(shí)現(xiàn)按位左移運(yùn)算。例如:
SELECT LEFT_SHIFT(1, 5), 1<<5;
| |
--+--+
32|32|
新增 RIGHT_SHIFT() 函數(shù)以及 >> 運(yùn)算符,用于實(shí)現(xiàn)按位右移運(yùn)算。例如:
SELECT RIGHT_SHIFT(32, 2), 32>>2;
| |
-+-+
8|8|
新增 BIT_COUNT() 函數(shù),用于返回整數(shù)或者二進(jìn)制數(shù)中設(shè)置為 1 的位數(shù)。例如:
SELECT BIT_COUNT(10) as Count1, BIT_COUNT(0x0a) as Count2;
Count1|Count2|
------+------+
2| 2|
整數(shù) 10 和十六進(jìn)制 0x0a 的二進(jìn)制表達(dá)式都為 1010,只有 2 位設(shè)置為 1。
新增 GET_BIT() 函數(shù),用于返回整數(shù)或者二進(jìn)制數(shù)中指定偏移量對應(yīng)的位,偏移量從 0 開始。例如:
SELECT GET_BIT(10, 1) as Get_1st_Bit, GET_BIT(10, 2) as Get_2nd_Bit;
Get_1st_Bit|Get_2nd_Bit|
-----------+-----------+
1| 0|
整數(shù) 10 的二進(jìn)制表達(dá)式為 1010,偏移量為 1 的位為 1,偏移量為 2 的位為 0。
新增 SET_BIT() 函數(shù),用于設(shè)置并返回整數(shù)或者二進(jìn)制數(shù)中指定偏移量對應(yīng)的位,偏移量從 0 開始。例如:文章來源:http://www.zghlxwxcb.cn/news/detail-441672.html
SELECT SET_BIT(10, 0) as Result1, SET_BIT(10, 1, 0) as Result2;
Result1|Result2|
-------+-------+
11| 8|
整數(shù) 10 的二進(jìn)制表達(dá)式為 1010,將偏移量為 0 的位設(shè)置為 1,返回結(jié)果為二進(jìn)制的 1011,也就是十進(jìn)制的 11。將偏移量為 1 的位設(shè)置為 0,返回結(jié)果為二進(jìn)制的 1000,也就是十進(jìn)制的 8。文章來源地址http://www.zghlxwxcb.cn/news/detail-441672.html
到了這里,關(guān)于Microsoft SQL Server 2022 新特性之 T-SQL 語言增強(qiáng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!