導航:首頁 > 凈水問答 > oracle過濾函數

oracle過濾函數

發布時間:2023-01-19 02:55:31

Ⅰ ORACLE中怎樣用正則表達式過濾中文字元

從表裡提取漢字, 需要考慮字元集, 不同的字元集漢字的編碼有所不同
這里以GB2312為例, 寫一函數准確地從表裡提取簡體漢字.

假設資料庫字元集編碼是GB2312, 環境變數(注冊表或其它)的字元集也是GB2312編碼
並且保存到表裡的漢字也都是GB2312編碼的

那麼也就是漢字是雙位元組的,且簡體漢字的編碼范圍是
B0A1 - F7FE
換算成10進制就是
B0 A1 F7 FE
176,161 - 247,254

我們先看一下asciistr函數的定義
Non-ASCII characters are converted to the form \xxxx, where xxxx represents a UTF-16 code unit.
但是這並不表示以 "\" 開始的字元就是漢字了

舉例如下
SQL> select * from test;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC

這里第5條記錄有一個實心的五角星
然後用asciistr函數轉換一下試試
SQL> select name,asciistr(name) from test;

NAME ASCIISTR(NAME)
-------------------- ----------------------
,啊OO10哈 ,\554AOO10\54C8
你好aa \4F60\597Daa
大家好aa/ \5927\5BB6\597Daa/
☆大海123 \2606\5927\6D77123
★ABC \2605ABC

我們看到最後一條記錄的實心五角星也是 "\"開頭的
此時我們就不能用asciistr(欄位)是否存在 "\" 來判斷是否含有漢字了.

我的函數如下,基本思路是判斷字元的編碼是否在GB2312規定的漢字編碼范圍之內
[PHP]
create or replace function get_chinese(p_name in varchar2) return varchar2
as
v_code varchar2(30000) := '';
v_chinese varchar2(4000) := '';
v_comma pls_integer;
v_code_q pls_integer;
v_code_w pls_integer;
begin
if p_name is not null then
select replace(substrb(mp(p_name,1010),instrb(mp(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ','') into v_code from al where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma := instrb(v_code,',');
v_code_q := to_number(substrb(v_code,1,v_comma-1));
v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese := v_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end loop;
return v_chinese;
else
return '';
end if;
end;
/
.
[/PHP]

好,現在來執行一些語句
SQL> select * from test;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC

5 rows selected.

1. 列出有漢字的記錄
SQL> select name from test where length(get_chinese(name))>0;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123

4 rows selected.

2. 列出有漢字的記錄,並且只列出漢字

SQL> select get_chinese(name) from test where length(get_chinese(name))>0;

GET_CHINESE(NAME)
---------------------------------------------------------------------------
啊哈
你好
大家好
大海

4 rows selected.

需要說明的是GB2312共有6763個漢字,即72*94-5=6763
我這里是計算72*94,沒有減去那5個,那五個是空的。等查到了再減去
============

改寫這個函數,可以提取非漢字或者漢字
該函數有兩個參數,第一個表示要提取的字元串,第二個是1,表示提取漢字,是非1,表示提取非漢字

[PHP]
create or replace function get_chinese
(
p_name in varchar2,
p_chinese in varchar2
) return varchar2
as
v_code varchar2(30000) := '';
v_chinese varchar2(4000) := '';
v_non_chinese varchar2(4000) := '';
v_comma pls_integer;
v_code_q pls_integer;
v_code_w pls_integer;
begin
if p_name is not null then
select replace(substrb(mp(p_name,1010),instrb(mp(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ','') into v_code from al where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma := instrb(v_code,',');
v_code_q := to_number(substrb(v_code,1,v_comma-1));
v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese := v_chinese||substr(p_name,i,1);
else
v_non_chinese := v_non_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
else
v_non_chinese := v_non_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end loop;
if p_chinese = '1' then
return v_chinese;
else
return v_non_chinese;
end if;
else
return '';
end if;
end;
/

.
[/PHP]
SQL> select * from a;

NAME
--------------------
我們啊、
他(艾呀)是★們
他的\啊@

SQL> select get_chinese(name,1) from a;

GET_CHINESE(NAME,1)
-----------------------------------------
我們啊
他艾呀是們
他的啊

SQL> select get_chinese(name,0) from a;

GET_CHINESE(NAME,0)
-----------------------------------------

()★
\@

SQL>

Ⅱ oracle中能去掉數據前後空格的函數是什麼

selecttrim('aaa')fromal;


selectLtrim('aaa')fromal;


selectRtrim('aaa')fromal;


selectRtrim(Ltrim('aaa'))fromal。

Ⅲ oracle 里使用any 函數過濾參數時需要處理大小寫,但加上upper函數後就不能工作了 請問如何結合使用

語句貼出來啊

Ⅳ oracle 中的幾個常用函數

Oracle常用函數:

  1. Substr截取函數

  2. Distinct去除重復函數

  3. Having一般與groupby公用的限制語句他不與單個值有關而是與組有關

  4. Innerjoin……on內連接語句

  5. Abs取絕對值的函數SelectAsb(-100)fromal

  6. mod取余函數

  7. sign返回數的符號正為10為0負為-1

  8. cell(n)返回>=n的最小整數要求n必須是十進制的數

  9. sort(n)返回n的平方根當n小於0是返回nanPower(n1,n2)返回n1的n2次冪Exp(n)返回e的n次冪

  10. LOG(n1,n2)返回以n1為底n2的對數n1不為0,1Ln(n)返回n的自然對數n不為0,1

  11. ASCII(char)返回參數首字母的ASCII碼值

  12. lengtch(char)返回字元串char的長度

  13. substr(『給定的字元串』,A,B)A表示從第幾位開始截B表示截幾位,如果A為負值從右邊數到A位開始向後截B位

  14. cast數據類型轉換函數

  15. chartorowid函數將char類型轉換為ROWID類型但是最後長度必須滿足rowid的標准18位

  16. Rowidtochar函數將rowid類型轉換為char因為rowid長度為18,故轉換成的字元串也是18位。

  17. to_char(number)將數字類型轉換成字元類型To_char(data) 將日期轉換成字元型

  18. lnnvl(條件)排除條件得到指定條件之外的函數

  19. nvl(expr1,expr2)如果expr1為null則返回expr2否則返回expr1

Ⅳ oracle中的procere中trim,upper函數和decode函數有什麼不同

decode函數有參數

trim函數過濾掉字元串的空格,
upper函數將字元串轉為大寫
decode函數: DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
Value 代表某個表的任何類型的任意列或一個通過計算所得的任何結果。當每個value值被測試,如果value的值為if1,Decode 函數的結果是then1;如果value等於if2,Decode函數結果是then2;等等。事實上,可以給出多個if/then 配對。如果value結果不等於給出的任何配對時,Decode 結果就返回else 。
需要注意的是,這里的if、then及else 都可以是函數或計算表達式。

Ⅵ 如何優化Oracle在where條件中用了自定義函

Oracle的自定義函數,提供了對邏輯的封裝能力,便於我們對代碼進行管理。然而當這個函數出現在where語句中,它卻很可能給我們的SQL語句帶來嚴重的效率問題。因為:
1、Oracle的優化器無法對函數進行優化,只能逐行執行(這就是為什麼我們常發現,把函數裡面的語句拷出來,就會執行得很快的原因)
2、函數並非標准SQL所包含的東西,因此Oracle在執行函數時,會頻繁在SQL上下文和PL/SQL上下文之間切換。當數據量大時,就會增加CPU和內存的消耗,降低語句執行的效率。
因此,自定義函數,就像一把雙刃劍一樣,擺在了我們面前。對此,我們有以下幾種對策:
1、不用函數
2、借用Oracle的緩存機制
3、函數索引
1)不用函數。不用函數確實能解決問題,但如果一段邏輯會被很多個SQL語句用到,這就會給我們的代碼管理帶來了很大的麻煩。因此這是萬不得已的下下策。當然,沒必要使用函數的地方,可以盡量避免。
2)借用Oracle的緩存機制。
Oracle對子查詢,是會做緩存處理的。因此我們可以把函數寫在一個子查詢中,如把「my_func(id)」變成「(select my_func(id) from al)」。這樣做可以通過緩存,減少函數被調用的次數,從而提高效率。通常用函數對大數據量進行過濾時,此方法都可大量降低函數被調用的次數(可從Oracle的執行統計看出)
另一種方法,就是對函數強行開啟結果緩存。方法是在函數的return類型之後,加上「result_cache」標記。
3)使用函數索引。首先該函數必須被標記為deterministic,即在函數的return類型之後,加上「deterministic」標記。它表示當函數的輸入值是確定時,返回結果必定是唯一的。此後,在表的列上新建索引,索引列不是寫列名,而是寫「my_func(id)」這樣即可。
通常地,我推薦先嘗試「子查詢緩存」這種方法。因為它不僅對函數、表本身沒有作任何修改,而且效果也比較明顯。我曾經試過對一條很復雜的SQL做了這種處理,結果執行效率提高了60倍之多!如果緩存效果不明顯時,可以再嘗試下函數索引。不過我發現同樣的SQL,我只加函數索引的話,效果並不如「子查詢緩存」那樣立竿見影。
注意,以上提到的,都只是一些調優的手段而已,並非一定能解決問題。所以可以的話,我們還是要盡量避免把函數放在where語句中。

Ⅶ oracle sQL 過濾定義怎樣寫

你要查詢的目標是???

Ⅷ oracle 自定義函數處理『過濾掉空格和其他特殊字元函數』怎麼寫

用regexp_replace這個函數根據正則表達式將特殊字元替換成空串

Ⅸ Oracle中使用to_number()函數,裡面有文字怎麼解決

你好!
你可以通過過濾,把有文字的數據過濾掉!
文字過濾的話,可能需要用到正則表達式了!
如果不會的話,採納本問題,新開設問題提問一下!
給你解決!
望採納!

Ⅹ oracle的條件後面可以把兩個欄位拼起來過濾嗎 就是能不能用concat函數啊

可以的,其實沒必要用concat,直接用||就可以了。

閱讀全文

與oracle過濾函數相關的資料

熱點內容
為什麼要洗超濾裝置 瀏覽:170
反滲透教育班會記錄 瀏覽:124
環氧樹脂灌膠去除 瀏覽:817
反滲透式凈水機產生的廢水 瀏覽:125
發電廠的脫硫廢水 瀏覽:306
空調過濾網壞了咋辦 瀏覽:386
焦化廢水與生活污水的區別 瀏覽:840
別人用粵語說謝謝怎麼回 瀏覽:970
荏源污水提升泵 瀏覽:303
如何清洗轎車上的白色水垢 瀏覽:399
寧河區污水處理廠地址 瀏覽:314
夏利n5的空調濾芯在哪裡更換 瀏覽:999
污水現場監測調查包括什麼 瀏覽:17
牛廢水能澆茶樹嗎 瀏覽:141
烤貼面和樹脂貼面 瀏覽:186
實驗室製取蒸餾水的目的是什麼 瀏覽:214
污水處理有哪些基本辦法 瀏覽:476
污水磷酸二氫鉀的作用 瀏覽:760
離子交換樹脂芳香型 瀏覽:850
65度水溫有水垢嗎 瀏覽:285