Case sensibile e insensibile come in SQLite

In SQLite è ansible modificare il comportamento case sensitive di ‘LIKE’ usando i comandi:

PRAGMA case_sensitive_like=ON; PRAGMA case_sensitive_like=OFF; 

Tuttavia, nella mia situazione, vorrei eseguire una query, parte della quale è sensibile al maiuscolo e minuscolo e parte di essa non lo è. Per esempio:

 SELECT * FROM mytable WHERE caseSensitiveField like 'test%' AND caseInsensitiveField like 'g2%' 

È ansible?

Puoi utilizzare la parola chiave UPPER sul campo senza distinzione tra maiuscole e minuscole, quindi maiuscole e minuscole. per esempio

 SELECT * FROM mytable WHERE caseSensitiveField like 'test%' AND UPPER(caseInsensitiveField) like 'G2%' 

Utilizza confronti semplici, che sono sensibili al maiuscolo e al minuscolo per impostazione predefinita (a meno che tu non abbia dichiarato la colonna COLLATE NOCASE ):

 SELECT * FROM mytable WHERE caseSensitiveField >= 'test' AND caseSensitiveField < 'tesu' AND caseInsensitiveField LIKE 'g2%' 

Funziona solo se l'originale LIKE sta cercando un prefisso, ma consente l'uso di un indice.

So che questa è una vecchia domanda, ma se stai codificando in Java e hai questo problema, potrebbe essere utile. È ansible registrare una funzione che gestisce il controllo simile. Ho ricevuto il modulo di suggerimento in questo post: https://stackoverflow.com/a/29831950/1271573

La soluzione dipende da sqlite jdbc: https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc

Nel mio caso avevo solo bisogno di vedere se esisteva una certa stringa come parte di un’altra stringa (come ‘% mystring%’), quindi ho creato una funzione Contains, ma dovrebbe essere ansible estenderla per eseguire un controllo più sql usando regex o qualcosa del genere.

Per usare la funzione in SQL per vedere se MyCol contiene “searchstring” dovresti fare:

 select * from mytable where Contains(MyCol, 'searchstring') 

Ecco la mia funzione Contiene:

 public class Contains extends Function { @Override protected void xFunc() throws SQLException { if (args() != 2) { throw new SQLException("Contains(t1,t2): Invalid argument count. Requires 2, but found " + args()); } String testValue = value_text(0).toLowerCase(); String isLike = value_text(1).toLowerCase(); if (testValue.contains(isLike)) { result(1); } else { result(0); } } } 

Per usare questa funzione devi prima registrarla. Quando hai finito di usarlo, puoi opzionalmente distruggerlo. Ecco come:

 public static void registerContainsFunc(Connection con) throws SQLException { Function.create(con, Contains.class.getSimpleName(), new Contains()); } public static void destroyContainsFunc(Connection con) throws SQLException { Function.destroy(con, Contains.class.getSimpleName()); } 

Per eseguire query sensibili al maiuscolo / minuscolo in una colonna creata con COLLATE NOCASE, utilizzare COLLATE BINARY:

 select * from myTable where name like 'Test%' COLLATE BINARY;