Вы можете использовать функцию SQLite regexp
, но только после ее регистрации.
con0 <- DBI::dbConnect(RSQLite::SQLite())
DBI::dbExecute(con0, "CREATE TABLE personal_websessions(id_no INTEGER PRIMARY KEY, website_link TEXT)")
# [1] 0
DBI::dbExecute(con0, "INSERT INTO personal_websessions VALUES(1, 'google.com'), (2, 'stackoverflow.com '), (3, 'msn.com ')")
# [1] 3
DBI::dbExecute(con0, "INSERT INTO personal_websessions VALUES(4, 'msnnews.com')")
# [1] 1
DBI::dbGetQuery(con0, "select * from personal_websessions where website_link like 'msn%'")
# id_no website_link
# 1 3 msn.com
# 2 4 msnnews.com
DBI::dbGetQuery(con0, "select * from personal_websessions where website_link regexp '\\bmsn\\b'")
# Error: no such function: regexp
RSQLite::initRegExp(con0)
DBI::dbGetQuery(con0, "select * from personal_websessions where website_link regexp '\\bmsn\\b'")
# id_no website_link
# 1 3 msn.com
Чтобы заменить"msn" на "toast" (внутри строки (в качестве замены подстроки), однако, SQLite в настоящее время не имеет встроенной поддержки замены регулярного выражения (за исключением icu_replace.c
, найдено здесь ).
Если вы уверены, что вы будете не найти "msn" несколько раз в одной строке (например, "msnnews.msn.com"
), однако вы можете найти с помощью регулярного выражения (как указано выше) и затем использовать не регулярное выражение replace
. Продолжая приведенный выше пример:
DBI::dbGetQuery(con0, "
select id_no, replace(website_link,'msn','toast') as website_link
from personal_websessions
where website_link regexp '\\bmsn\\b'")
# id_no website_link
# 1 3 toast.com
И если вам нужно заменить все строки только этой частью, объединение будет работать:
DBI::dbGetQuery(con0, "
select id_no, replace(website_link,'msn','toast') as website_link
from personal_websessions
where website_link regexp '\\bmsn\\b'
union
select id_no, website_link
from personal_websessions
where not website_link regexp '\\bmsn\\b' ")
# id_no website_link
# 1 1 google.com
# 2 2 stackoverflow.com
# 3 3 toast.com
# 4 4 msnnews.com