You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止glue_sql将布尔值自动转换为整数?

解决glue_sql将布尔值转换为整数的问题

glue_sql默认会通过DBI的dbQuoteLiteral方法转换R对象为SQL字面量,而SQLite的该方法会把布尔值TRUE/FALSE转为1/0。要阻止这种转换,让SQL语句中保留TRUE/FALSE字面量,可以通过以下两种方式实现:

方法一:手动将布尔值包装为SQL对象

直接用DBI::SQL()将布尔值包装为SQL原生字面量,这样glue_sql会直接插入这些值而不进行转换:

library(glue)
library(DBI)
library(RSQLite)

con <- dbConnect(RSQLite::SQLite(), "test.sqlite")

# 将布尔值用SQL()包装
rows <- list("ABC", 1, pi, SQL("TRUE"), SQL("FALSE"))

glue_sql("INSERT into table values ({rows*})", rows = rows, .con = con)
#> <SQL> INSERT into table values ('ABC', 1, 3.14159265358979, TRUE, FALSE)

方法二:批量处理布尔值

如果有大量布尔值需要处理,可以写一个辅助函数自动转换:

library(glue)
library(DBI)
library(RSQLite)

con <- dbConnect(RSQLite::SQLite(), "test.sqlite")

# 定义布尔值转换函数
format_sql_bool <- function(x) {
  if (is.logical(x)) {
    SQL(ifelse(x, "TRUE", "FALSE"))
  } else {
    x
  }
}

rows <- list("ABC", 1, pi, TRUE, FALSE)
# 批量处理列表中的布尔值
processed_rows <- lapply(rows, format_sql_bool)

glue_sql("INSERT into table values ({processed_rows*})", processed_rows = processed_rows, .con = con)
#> <SQL> INSERT into table values ('ABC', 1, 3.14159265358979, TRUE, FALSE)

注意事项

SQLite本身没有原生的布尔数据类型,即使SQL语句中写TRUE/FALSE,最终存储到数据库中的还是整数1/0。如果使用PostgreSQL等原生支持布尔类型的数据库,上述方法会正确插入布尔类型值。

内容的提问来源于stack exchange,提问作者Martin Gal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:14:57