首页 > 解决方案 > 在 SQL 查询列上运行 While 循环(需要使用 sqldf 完成)

问题描述

我不确定这是否可能。

现在我正在使用sqldf包运行它:

Col1 <- c('emdabcer','deffghiee','lmnop')
Col2 <- c(1,2,3)
df <- data.frame(Col1, Col2)

df
      Col1 Col2
  emdabcer    1
 deffghiee    2
     lmnop    3

现在,我正在手动输入 SQL 脚本。

sqldf("SELECT *, CASE 
WHEN [Col1] LIKE '%abc%' THEN REPLACE([Col1], [Col1], 'Label1')
WHEN [Col1] LIKE '%def%' AND [Col1] LIKE '%ghi%' THEN REPLACE([Col1], [Col1], 'Label2')
ELSE NULL END [Category Label] FROM df")

我的实际数据集中有 40 个不同的 CASE WHEN 实例。

有没有办法我可以使用一个单独的表/数据框,它有一列我的 SQL 查询并运行每一行来获取我的输出?

下面是我的查询的示例数据框:

Queries <- c("WHEN [Col1] LIKE '%abc%' THEN REPLACE([Col1], [Col1], 'Label1')",
         "WHEN [Col1] LIKE '%def%' AND [Col1] LIKE '%ghi%' THEN REPLACE([Col1], [Col1], 'Label2')",
         "WHEN [Col1] LIKE '%mn%' THEN REPLACE([Col1], [Col1], 'Label3')")
Query_df <- data.frame(Queries)

Query_df

Queries
WHEN [Col1] LIKE '%abc%' THEN REPLACE([Col1], [Col1], 'Label1')
WHEN [Col1] LIKE '%def%' AND [Col1] LIKE '%ghi%' THEN REPLACE([Col1], [Col1], 'Label2')
WHEN [Col1] LIKE '%mn%' THEN REPLACE([Col1], [Col1], 'Label3')

然后我会做这样的事情:

sqldf("SELECT *, CASE 
WHILE length(Queries_df) <= length(Queries_df)
BEGIN RUN Queries
END

我知道上面的内容是错误的,但沿着这些思路。

任何帮助都会非常感谢!

这是我正在研究的参考:https ://www.essentialsql.com/using-while-statement-stored-procedures/

标签: rwhile-loopsqldf

解决方案


创建Pat定义要查找的模式的数据框,然后将其加入df

Pat <- data.frame(
  pat1 = c('abc', 'def'),
  pat2 = c('', 'ghi'),
  Label = c('Label1', 'Label2'),
  stringsAsFactors = FALSE)

sqldf("select a.*, b.Label
  from df a 
  left join Pat b on a.Col1 like '%' || b.pat1 || '%' and 
                     a.Col1 like '%' || b.pat2 || '%'")

给予:

       Col1 Col2  Label
1  emdabcer    1 Label1
2 deffghiee    2 Label2
3     lmnop    3   <NA>

推荐阅读