Запрос фильтра SQL в базе данных dplyr чувствителен к регистру - PullRequest
0 голосов
/ 25 августа 2018

Я хочу отфильтровать базу данных 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 Ответ

0 голосов
/ 25 августа 2018

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

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

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

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

...a LIKE '%MS%' COLLATE NOCASE
...