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

Oracle 提取字串中漢字的兩種高效方案

     編輯:Oracle 教學

Oracle 提取字串中漢字的兩種高效方案

實務上常需清洗資料,移除特殊字元僅保留中文。本文提供兩種 PL/SQL 實作方案並分析優劣。

方案一:利用 LENGTH 與 LENGTHB 差異

原理: 中文字元在 LENGTH 中計為 1 字元,在 LENGTHB 中佔 2 位元組;英文/數字/常見符號兩者相等。

CREATE OR REPLACE FUNCTION get_chinese_v1(p_str VARCHAR2) RETURN VARCHAR2 IS
  v_len  NUMBER := LENGTH(p_str);
  v_lenb NUMBER := LENGTHB(p_str);
  v_result VARCHAR2(4000);
BEGIN
  IF v_len = v_lenb THEN
    RETURN NULL; -- 純 ASCII
  END IF;
  -- 逐字元判斷邏輯略
  RETURN v_result;
END;

缺點: 部分特殊字元(如全形符號)同樣符合「1字元=2位元組」,導致誤判。

方案二:ASCII 碼範圍精準過濾(推薦)

原理: 常用漢字在 Oracle 字元集(如 ZHS16GBK)中的內部碼範圍約為 45217~63486。利用 ASCII() 函數逐字元判斷。

CREATE OR REPLACE FUNCTION get_chinese_text(p_str VARCHAR2) RETURN VARCHAR2 IS
  v_result   VARCHAR2(4000) := '';
  v_len      NUMBER := LENGTH(p_str);
  v_char     VARCHAR2(2);
  v_ascii    NUMBER;
BEGIN
  FOR i IN 1..v_len LOOP
    v_char  := SUBSTR(p_str, i, 1);
    v_ascii := ASCII(v_char);
    IF v_ascii > 45216 THEN
      v_result := v_result || v_char;
    END IF;
  END LOOP;
  RETURN v_result;
END get_chinese_text;

測試範例

SELECT get_chinese_text('ABC中文123測試!@#') FROM dual;
-- 返回:中文測試

結論: 方案二能完美區分漢字與其他字元,適用於資料清洗、ETL 前處理等場景。

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