2017-04-26 51 views
0

我正在查詢Oracle 12c數據庫,我需要過濾掉日語中的值,因爲接收這些值的Java應用程序當前不能顯示日語字符。對於快速演示,有什麼辦法可以避免結果中的日文字符串?如何過濾SQL查詢中的日文值?

+0

只接受英文字符? 'REGEXP_REPLACE'用'''替換任何不是英文的字符' –

+0

[日文的Unicode範圍]的可能重複(http://stackoverflow.com/questions/19899554/unicode-range-for-japanese) – Shnugo

+0

@ Shnugo不是重複的 - 只是給出了日文字符的unicode範圍,但沒有顯示如何從Oracle中的字符串中過濾這些值。 – MT0

回答

0

我沒有改變NLS_LANG格式來正確插入日文字符。使用regexp_like可以過濾沒有字母數字數據的記錄。

create table table1 (name varchar2(100)); 
insert into table1 (name) values ('ABC'); 
insert into table1 (name) values ('DEF'); 
insert into table1 (name) values ('GHI'); 
insert into table1 (name) values ('JKL'); 
insert into table1 (name) values ('GHI'); 
insert into table1 (name) values ('昨夜のコンサ'); 
insert into table1 (name) values ('昨夜のABC'); 

select * from table1; 

select * from table1 where regexp_like (name,'^[0-9a-zA-Z]+$'); 

select nvl(regexp_replace(name,'[^0-9a-zA-Z'']',''),'blank') from table1; 
+0

這將簡單地忽略所有具有日文字符的記錄,OP只想過濾出日文字符。 –

+0

@SudiptaMondal謝謝你指出。我現在編輯了我的答案。 – Sandeep

+0

這會忽略太多的值,包括日語以外的語言中的標點符號和字符。 OP的問題只是關於過濾掉日文字符(而不是其他語言)。 – MT0

0

對於select語句中的所有列,您需要用NULL替換所有非英文字符。

select regexp_replace (column_name,'[^\x80-\xFF]',NULL) from table_name; 

這將取代任何這是不以英文字符爲NULL

+0

這將匹配太多字符; OP不想刪除非英文字符,只是日文字符。 – MT0

+0

@ MT0假設它不是安全的,Java應用程序可能有限制只顯示英文字符 –

+0

您可能會認爲,但這不是OP的問題所要求的。 – MT0

0

鑑於the unicode ranges for Japanese characters只需更換日文字符:

SELECT REGEXP_REPLACE(
     your_column, 
     UNISTR('[\3000-\303f\3040-\309f\30a0-\30ff\ff00-\ffef\4e00-\9faf]'), 
     NULL 
     ) 
FROM your_table 

或忽略這些行:

SELECT * 
FROM your_table 
WHERE NOT REGEXP_LIKE(
     your_column, 
     UNISTR('[\3000-\303f\3040-\309f\30a0-\30ff\ff00-\ffef\4e00-\9faf]') 
     )