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.