首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 字串處理:擷取漢字、數字與英文字母的自訂函數

     編輯:關於SqlServer

在 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'%[吖-咗]%';

使用建議與注意事項

  • 函數採用逐字符迴圈移除,資料量大時效能較低,建議僅用於臨時查詢或小量資料處理。
  • 若需高效能大量資料清洗,可考慮 CLR 函數或在應用層預處理。
  • 中文範圍 吖-座 涵蓋常用漢字,但可能遺漏部分生僻字或擴展區字符,視實際需求調整。

這三個函數涵蓋了最常見的字串分類擷取場景,可直接部署至資料庫供查詢、ETL 或報表使用,提升 T-SQL 字串處理靈活度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved