在dbGetQuery中的()查询中为sql准备字符串

时间:2016-09-12 13:23:34

标签: mysql r

我已经编写了以下查询来研究我的分析的一些示例方法,这项工作很好,我不需要提供这些代码。但是我需要理解"",; sep=""和dbGetQuery中的limit语句的使用。

df <- data.frame(Sample.Num = integer(),
                 Sample.Mean = integer(),
                 quant.01 = integer(),
                 quant.05 = integer(),
                 quant.10 = integer(),
                 quant.25 = integer(),
                 quant.50 = integer(),
                 quant.75 = integer(),
                 stringsAsFactors = FALSE)
df[1,] <- NA
for (i in 1:500){
  sdf <- dbGetQuery(con,"select col11,col23,col30
                    from schema.db.name
                    where col1 in ('value1')
                    and col2 in ('(v3) - value3')
                    and col3 in ('v0123 - value4')
                    order by random()*600000 limit 100")
  meansample <- mean(sdf$mileage,na.rm = TRUE)
  quant.01 <- quantile(sdf$mileage,na.rm = TRUE,probs = .01)
  quant.05 <- quantile(sdf$mileage,na.rm = TRUE,probs = .05)
  quant.10 <- quantile(sdf$mileage,na.rm = TRUE,probs = .10)
  quant.25 <- quantile(sdf$mileage,na.rm = TRUE,probs = .25)
  quant.50 <- quantile(sdf$mileage,na.rm = TRUE,probs = .50)
  quant.75 <- quantile(sdf$mileage,na.rm = TRUE,probs = .75)
dbDisconnect(con)

问题:

Col1,2&amp; 3有字符值。现在我需要为col2的所有7个值和col3的9个值检查相同的内容。每当我使用col1,2,3的任何特定值时,我都需要将它们存储在数据帧中,以便在循环结束之前执行某些操作,并以第二个值重新启动。

因此,这需要学习:Add a dynamic value into RMySQL getQuery

我也研究过gsubshQuote。尽管存在多种组合以及限制声明,但我无法概念化'", df[i], "';", sep = ""的使用。如果它是本地数据库,我可以使用dplyr包来运行循环。我了解seq_along()需要一个数值,并且要通过循环设置正确的值&#39;在()查询中。我确实尝试了paste0和paste参数以及collapse =&#34;,&#34;争论但没有帮助。 我也尝试过以下帖子中的lapply,但它在()查询中不起作用。

How to do dbGetQuery for loop in R

(v3) - value3,(v1) - value1等是col中的实际元素。这是属性col2,col3等的代码和描述的组合。

1 个答案:

答案 0 :(得分:0)

假设您有一个查询,并希望替换其中的某些范围值。

sql <- "select col11,col23,col30
                    from schema.db.name
                    where col1 in (%s)
                    and col2 in (%s)
                    and col3 in (%s)
                    order by random()*600000 limit 100"

这里我将使用 sprintf 在查询中进行替换, 所以我在字符串中留下了标记(%s )。 因此,让我们设置3个我们想要测试的范围:

col1 <- 1:10
col2 <- c('a', 'f', 'z')
col3 <- c('name1', 'name2')

# create strings that are valid in SQL
col1_sql <- paste(col1, collapse = ',')
col2_sql <- paste0("'", col2, "'", collapse = ',')  # put quotes on strings
col3_sql <- paste0("'", col3, "'", collapse = ',')

# now substitute back in query
sql_new <- sprintf(sql,
                   col1_sql,  # strings we just constructed
                   col2_sql,
                   col3_sql
)

# print out the query
cat(sql_new)

以下是查询内容:

select col11,col23,col30
    from schema.db.name
    where col1 in (1,2,3,4,5,6,7,8,9,10)
    and col2 in ('a','f','z')
    and col3 in ('name1','name2')
    order by random()*600000 limit 100