LIKE

2009-10-15 11 views
5

के साथ ओरेकल में एक्सेंट और केस असंवेदनशील संयोजन मुझे यह उत्तर उपयोगी पाया गया है: Accent and case insensitive COLLATE equivalent in Oracle, लेकिन मेरा प्रश्न संस्करण 9 ओरेकल डीबी के साथ खोजना पसंद है।LIKE

मैं इस तरह एक प्रश्न की कोशिश की है:

SELECT column_name 
FROM table_name 
WHERE NLSSORT(column_name, 'NLS_SORT = Latin_AI') 
LIKE NLSSORT('%somethingInDB%', 'NLS_SORT = Latin_AI') 

लेकिन कोई परिणाम नहीं कभी लौट कर रहे हैं।

import org.apache.commons.dbcp.BasicDataSource; 
import java.sql.Connection; 
import java.sql.SQLException; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 

public class DbCollationTest 
{ 
public static void main(String[] args) throws SQLException 
{ 
    BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 
    dataSource.setUrl("url"); 
    dataSource.setUsername("usr"); 
    dataSource.setPassword("pass"); 

    Connection conn = null; 
    PreparedStatement createStatement = null; 
    PreparedStatement populateStatement = null; 
    PreparedStatement queryStatement = null; 
    PreparedStatement deleteStatement = null; 
    ResultSet rs = null; 

    try 
    { 
    conn = dataSource.getConnection(); 

    createStatement = conn.prepareStatement("CREATE TABLE CollationTestTable (Name varchar(255))"); 
    createStatement.execute(); 

    String[] names = { "pepe", "pépé", "PEPE", "MEME", "mémé", "meme" }; 
    int i = 1; 

    for (String name : names) 
    { 
    populateStatement = conn.prepareStatement("INSERT INTO CollationTestTable VALUES (?)"); 
    populateStatement.setString(1, name); 
    populateStatement.execute(); 
    } 

    queryStatement = conn.prepareStatement("SELECT Name FROM CollationTestTable WHERE NLSSORT(NAME, 'NLS_SORT = Latin_AI') LIKE NLSSORT('%pe%', 'NLS_SORT = Latin_AI')"); 
    rs = queryStatement.executeQuery(); 

    while (rs.next()) 
    { 
    System.out.println(rs.getString(1)); 
    } 

    deleteStatement = conn.prepareStatement("DROP TABLE CollationTestTable"); 
    deleteStatement.execute(); 
    } 
    finally 
    { 
    //DBTools.tidyUp(conn, null, rs); 
    //DBTools.tidyUp(createStatement); 
    //DBTools.tidyUp(populateStatement); 
    //DBTools.tidyUp(queryStatement); 
    //DBTools.tidyUp(deleteStatement); 
    } 
} 
} 

मैं नहीं किया है किसी भी सफलता googling, किसी को भी किसी भी समाधान है था:

मैं परीक्षण करने के लिए एक छोटे से जावा फ़ाइल बनाई?

मैं किसी नाम के हिस्से पर एक खोज करना चाहता हूं और केस और उच्चारण असंवेदनशीलता का उपयोग करके मेल खाते हैं।

उत्तर

9

एक विधि अपने सत्र मापदंडों NLS_SORT और NLS_COMP संशोधित करने के लिए होगा:

SQL> SELECT Name FROM CollationTestTable WHERE NAME LIKE '%pe%'; 

NAME 
-------------------------------------------------------------------------------- 
pepe 

SQL> alter session set nls_sort=Latin_AI; 

Session altered 

SQL> alter session set nls_comp=linguistic; 

Session altered 

SQL> SELECT Name FROM CollationTestTable WHERE NAME LIKE '%pe%'; 

NAME 
-------------------------------------------------------------------------------- 
pepe 
pépé 
PEPE 

रूप another SO में दिखाया गया है, तो आप (इस वजह NLSSORT returns a string of bytes कि छँटाई के लिए इस्तेमाल किया जाएगा, NLSSORT साथ की तरह ऑपरेटर का उपयोग नहीं कर सकते, और पसंद केवल charater तारों के साथ काम करता है)

अद्यतन: एनएलएस पैरामीटर सेट करते समय मेरी पहली पसंद होगी, आप एक ही resul प्राप्त करने के लिए अंतर्निहित कार्यों का भी उपयोग कर सकते हैं टी। कुछ उदाहरण:

SQL> SELECT Name 
    2 FROM CollationTestTable 
    3 WHERE upper(convert(NAME, 'US7ASCII')) 
    4   LIKE upper(convert('%pe%', 'US7ASCII')); 

NAME 
-------------------------------------------------------------------------------- 
pepe 
pépé 
PEPE 

SQL> SELECT Name 
    2 FROM CollationTestTable 
    3 WHERE upper(translate(NAME, 'àâéèêìîòôùûÿ', 'aaeeeiioouuy')) 
    4   LIKE upper(translate('%pe%', 'àâéèêìîòôùûÿ', 'aaeeeiioouuy')); 

NAME 
----------------------------------- 
pepe 
pépé 
PEPE 
+0

उत्तर के लिए धन्यवाद, क्या सत्र को बदलने के बिना ऐसा करने के लिए वैसे भी है? उसी सत्र में अन्य प्रश्नों के लिए मूल एनएलएस सेटिंग्स की आवश्यकता हो सकती है। चीयर्स। –

+0

@Ed: आप क्वेरी चलाने से पहले सत्र पैरामीटर को सहेज सकते हैं (nls_session_parameters से * चुनें) फिर क्वेरी के बाद उन्हें वापस डालें। –

+0

मैं इसका परीक्षण कर रहा हूं और सभी अच्छे लग रहे थे लेकिन अब मुझे बताया गया है कि एनएलएस_SORT और NLS_COMP समाधान केवल संस्करण 10 आर 2 में समर्थित है। मुझे न्यूनतम संस्करण 9 के साथ ओरेकल डेटाबेस का समर्थन करने की आवश्यकता है। क्या मैं एकमात्र तरीका केस और उच्चारण असंवेदनशील खोज कर सकता हूं? –

संबंधित मुद्दे