在本教學中,將學習如何使用SQL Server STRING_SPLIT()
函數將字串拆分為基於指定分隔符號的子字串行。
SQL Server STRING_SPLIT()函數簡介
STRING_SPLIT()
函數是一個表值函數,它將字串拆分為一個表,該表由基於指定分隔符號的子字串行組成。
以下是STRING_SPLIT()
函數的語法:
STRING_SPLIT ( input_string , separator )
在這個語法中:
STRING_SPLIT()
函數返回單列表,其列名為value
。 此結果表包含作為子字串的行。
請注意,值列中的值可以按任何排序順序排列。 要獲得預期的順序,需要將ORDER BY子句添加到SELECT
語句中:
ORDER BY value [ASC|DESC]
SQL Server STRING_SPLIT()函數示例
下麵來看一些使用STRING_SPLIT()
函數的例子。
1. 使用STRING_SPLIT()函數拆分逗號分隔值字串
此示例使用STRING_SPLIT()
函數來解析以逗號分隔的值列表:
SELECT
value
FROM
STRING_SPLIT('red,green,,blue', ',');
執行上面查詢語句,得到以下結果:
value
---------------
red
green
blue
(4 rows affected)
第三行為空,因為輸入字串包含兩個連續的逗號(,,
)。 要獲取非空子字串,請在SELECT
語句中添加WHERE
子句,如以下查詢所示:
SELECT
value
FROM
STRING_SPLIT('red,green,,blue', ',')
WHERE
TRIM(value) <> '';
執行上面查詢語句,得到以下結果:
value
---------------
red
green
blue
(3 rows affected)
2. 使用STRING_SPLIT()函數在列中拆分逗號分隔的字串
有時,資料庫表未規範化。一個典型的例子是列可以存儲由逗號(,
)分隔的多個值。
STRING_SPLIT()
可以通過拆分這些多值列來幫助規範化數據。
為了方便演示,下麵創建一個示例表。
首先,創建一個名為sales.contacts
的新表,用於存儲聯繫資訊:
CREATE TABLE sales.contacts (
id INT PRIMARY KEY IDENTITY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
phones VARCHAR(500)
);
其次,在sales.contacts
表中插入一些聯繫人資訊:
INSERT INTO
sales.contacts(first_name, last_name, phones)
VALUES
('John','Doe','(408)-123-3456,(408)-123-3457'),
('Jane','Doe','(408)-987-4321,(408)-987-4322,(408)-987-4323');
第三,使用STRING_SPLIT()
函數拆分電話號碼和CROSS APPLY
以連接sales.contacts
表:
SELECT
first_name,
last_name,
value phone
FROM
sales.contacts
CROSS APPLY STRING_SPLIT(phones, ',');
執行上面查詢語句,得到以下結果:
3. STRING_SPLIT()函數使用帶有聚合函數
以下示例返回每個聯繫人的聯繫人和電話號碼:
SELECT
CONCAT_WS(' ',first_name,last_name) full_name,
COUNT(value) number_of_phones
FROM
sales.contacts
CROSS APPLY STRING_SPLIT(phones, ',')
GROUP BY
CONCAT_WS(' ',first_name,last_name);
執行上面查詢語句,得到以下結果:
在本教學中,學習了如何使用STRING_SPLIT()
函數將字串拆分為指定分隔符號的子字串表。