Запрос фильтра SQL в базе данных dplyr с учетом регистра

Я хочу отфильтровать базу данных SQLite в R в поисках шаблона в строке. Проблема в том, что запрос LIKE sql нечувствителен к регистру. Ниже воспроизводимый пример:

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 могло бы выполнить эту работу, но это не так.

спасибо


person dauby gilles    schedule 25.08.2018    source источник


Ответы (1)


В некоторых СУБД, таких как PostgreSQL, это очень легко сделать, просто используйте ILIKE :D

В SQLite на первый взгляд не так просто, но есть решение.

Полное решение можно найти в этом блоге. (в основном, пользовательская функция).

Если вам не нужна поддержка Unicode, только ASCII, вы можете использовать COLLATE NOCASE, и ваш пример будет выглядеть примерно так:

...a LIKE '%MS%' COLLATE NOCASE
person Spasa Mihajlovic    schedule 25.08.2018