funciones cast sqlite case-sensitive

cast - Sensible a mayúsculas y minúsculas como en SQLite



sqlite3 doc (4)

Para realizar consultas sensibles a mayúsculas / minúsculas en una columna creada con COLLATE NOCASE, utilice COLLATE BINARY:

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

En SQLite, es posible cambiar el comportamiento sensible a las mayúsculas y minúsculas de ''LIKE'' utilizando los comandos:

PRAGMA case_sensitive_like=ON; PRAGMA case_sensitive_like=OFF;

Sin embargo, en mi situación, me gustaría ejecutar una consulta, parte de la cual es sensible a mayúsculas y parte de la cual no. Por ejemplo:

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

es posible?


Puede usar la palabra clave UPPER en su campo insensible a mayúsculas y minúsculas en su declaración like. p.ej

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


Sé que esta es una vieja pregunta, pero si está codificando en Java y tiene este problema, podría ser útil. Puede registrar una función que maneja la verificación similar. Recibí la sugerencia de esta publicación: https://.com/a/29831950/1271573

La solución depende de sqlite jdbc: https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc

En mi caso, solo necesitaba ver si existía cierta cadena como parte de otra cadena (como ''% mystring%''), así que creé una función Contiene, pero debería ser posible extender esto para hacer un chequeo más similar a sql usando expresiones regulares o algo así.

Para usar la función en SQL para ver si MyCol contiene "searchstring", harías:

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

Aquí está mi función 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); } } }

Para usar esta función, primero debe registrarla. Cuando haya terminado de usarlo, puede destruirlo opcionalmente. Aquí es cómo:

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()); }


Utilice comparaciones simples, que son sensibles a las mayúsculas y minúsculas por defecto (a menos que haya declarado la columna COLLATE NOCASE ):

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

Esto funciona solo si el LIKE original está buscando un prefijo, pero permite usar un índice.