在 SQL Server 開發中,經常需要從混合字串中分離出特定類型的字符,例如只保留數字、英文字母或中文字。雖然 T-SQL 內建函數有限,但透過 PATINDEX 與 STUFF 結合迴圈,即可靈活實現此類需求。本文提供三個實用的純量值函數,分別用於擷取數字、英文字母與中文字,並附上測試範例供參考。
利用 PATINDEX('%[^0-9]%', @S) 找出第一個非數字字符的位置,再用 STUFF 將其移除,迴圈執行直到字串只剩數字。
IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL
DROP FUNCTION DBO.GET_NUMBER2;
GO
CREATE FUNCTION DBO.GET_NUMBER2(@S VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^0-9]%', @S) > 0
BEGIN
SET @S = STUFF(@S, PATINDEX('%[^0-9]%', @S), 1, '');
END
RETURN @S;
END;
GO
-- 測試
PRINT DBO.GET_NUMBER2('呵呵ABC123ABC'); -- 輸出:123
邏輯同上,模式改為 %[^a-z]%(不區分大小寫),即可保留 a-z 字母。
IF OBJECT_ID('DBO.GET_STR') IS NOT NULL
DROP FUNCTION DBO.GET_STR;
GO
CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^a-z]%', @S) > 0
BEGIN
SET @S = STUFF(@S, PATINDEX('%[^a-z]%', @S), 1, '');
END
RETURN @S;
END;
GO
-- 測試
PRINT DBO.GET_STR('呵呵ABC123ABC'); -- 輸出:ABCABC
中文範圍在 Unicode 中約為 吖-座,函數參數需用 NVARCHAR 以正確處理雙位元組字符。
IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
DROP FUNCTION DBO.CHINA_STR;
GO
CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
RETURNS NVARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^吖-座]%', @S) > 0
SET @S = STUFF(@S, PATINDEX('%[^吖-座]%', @S), 1, N'');
RETURN @S;
END;
GO
-- 測試
PRINT DBO.CHINA_STR(N'呵呵ABC123ABC'); -- 輸出:呵呵
-- 進階應用:查詢包含中文的資料列
SELECT * FROM (SELECT N'ASDKG論壇K聯通DL' AS col) TB
WHERE COL LIKE N'%[吖-咗]%';
吖-座 涵蓋常用漢字,但可能遺漏部分生僻字或擴展區字符,視實際需求調整。這三個函數涵蓋了最常見的字串分類擷取場景,可直接部署至資料庫供查詢、ETL 或報表使用,提升 T-SQL 字串處理靈活度。