AlfaTeK
AlfaTeK

Reputation: 7765

How to do a like case-insensitive and accent insensitive in Oracle 10gR2 and JPA?

In a J2EE project, using JPA, how can I force a like query to be case insensitive and accent insensitive?

I know about changing session variables NLS_COMP and NLS_SORT but I'm wondering if there is another trick to do this in the query itself, without changing session variables

Upvotes: 10

Views: 16618

Answers (3)

Martin Schapendonk
Martin Schapendonk

Reputation: 13496

You could use NLS_UPPER for that without altering the session:

select 1
from dual
where nls_upper('große', 'NLS_SORT = XGerman') like '%OSSE%';

NLS_UPPER documentation

Upvotes: -1

Pascal Thivent
Pascal Thivent

Reputation: 570325

(...) using JPA, how can I force a like query to be case insensitive and accent insensitive?

My answer will be JPQL oriented. For the former part, you could do:

where lower(name) like 'johny%';

For the later part, I'm not aware of a standard JPQL way to do it.

At the end, altering the session variables NLS_COMP and NLS_SORT is IMO the best option.

Upvotes: 8

Gary Myers
Gary Myers

Reputation: 35401

Crudely, you can do something like

select  upper(convert('This is a têst','US7ASCII')),
        upper(convert('THIS is A test','US7ASCII'))
from dual;

select  1 from dual 
where upper(convert('This is a têst','US7ASCII')) =
             upper(convert('THIS is A test','US7ASCII'))

The CONVERT reduces the accented characters to the mapped ASCII equivalent, and the UPPER forces lower case to uppercase. The resultant strings should be matchable.

Upvotes: 4

Related Questions