Запрос фильтра SQL в базе данных dplyr с учетом регистра
Я хочу отфильтровать базу данных SQLite в R, ища шаблон в строке. Проблема в том, что SQL-запрос LIKE кажется нечувствительным к регистру. Ниже воспроизводимый пример:
library(DBI)
library(dplyr)
tb <- dplyr::tibble(a=c(rep("aMSq",3), rep("amsq",3), rep("AA",3)))
mydb <- DBI::dbConnect(RSQLite::SQLite(), "")
DBI::dbWriteTable(mydb, "tb", tb, overwrite=T)
### Filtering the table
tb_sqlite <- tbl(mydb, "tb")
tb_sqlite %>%
filter( sql("a LIKE '%MS%'"))
dbDisconnect(mydb)
Вывод нечувствителен к регистру:
# Source: lazy query [?? x 1]
# Database: sqlite 3.22.0 []
a
<chr>
1 aMSq
2 aMSq
3 aMSq
4 amsq
5 amsq
6 amsq
Как я могу сделать поиск с учетом регистра? Я видел добавление BINARY после того, как LIKE может выполнить работу, но это не так.
ТКС
1 ответ
В некоторых СУБД, таких как PostgreSQL, это очень легко сделать, просто используйте ILIKE
:D
В SQLite, на первый взгляд, не все так просто, но есть решение.
Вы можете взглянуть на этот блог для полного решения (в основном, пользовательские функции).
Если вам не нужно поддерживать Unicode, просто ASCII, то вы можете использовать COLLATE NOCASE
и ваш пример будет выглядеть примерно так:
...a LIKE '%MS%' COLLATE NOCASE