簡體   English   中英

如何使用dplyr從SQL Server中的表連接多個列的字符串?

[英]How to concatenate strings of multiple columns from table in SQL Server using dplyr?

作為標題,我想連接SQL Server表中的幾列,我嘗試使用如下paste功能,但出現以下錯誤:

> tbl(channel,'##iris') %>% 
+   mutate(string=paste(Species,'-',
+                       Sepal.Length,'-',
+                       Sepal.Width,'-',
+                       Petal.Length,'-',
+                       Petal.Width,sep=''))
Error: PASTE() is not available in this SQL variant

我在這里找到了Ben Baumer。提供的解決方案,並想在這里分享。

方法是使用CONCAT而不是paste

> tbl(channel,'##iris') %>% 
+   group_by(Species,Sepal.Length,Sepal.Width,Petal.Length,Petal.Width) %>%
+   summarise(string=MAX(CONCAT(Species,'-',
+                               Sepal.Length,'-',
+                               Sepal.Width,'-',
+                               Petal.Length,'-',
+                               Petal.Width))) %>%
+   head(.,1)
# Source:   lazy query [?? x 6]
# Database: Microsoft SQL Server 11.00.6251[dbo@WCDCHCMSAH01\CMSAH_DC7_MP1/data_ha_amr]
# Groups:   Species, Sepal.Length, Sepal.Width, Petal.Length
  Species Sepal.Length Sepal.Width Petal.Length Petal.Width string              
  <chr>          <dbl>       <dbl>        <dbl>       <dbl> <chr>               
1 setosa          4.30        3.00         1.10       0.100 setosa-4.3-3-1.1-0.1

在R tidyverse上使用data.framestidyr::unite將是慣用的方法。

雖然不是dplyr動詞,但尚未翻譯為通過dbplyr / SQL

您可以定義自己的unite在SQL服務器這樣(我不能不幸測試,但它應該工作):

unite.tbl <- function (data, col, ..., sep = "_", remove = TRUE) 
{
  dot_names <- sapply(substitute(list(...))[-1], deparse)
  shown_cols <- if (remove) 
    setdiff(data$ops$vars, dot_names)
  else data$ops$vars
  shown_col_str <- paste(shown_cols, collapse = ", ")
  concat_str <- paste0("CONCAT(",paste(dot_names, collapse = paste0(",'",sep,"',")),")")
  col <- deparse(substitute(col))
  subquery <- capture.output(show_query(data), type = "message")[-1] %>% paste(collapse = " ")
  query    <- paste("SELECT",shown_col_str,",",concat_str,"AS",col,"FROM (",subquery,")")
  tbl(data$src$con, sql(query))
}

接着 :

tbl(channel,'##iris') %>%
  unite(string,
        Species, Sepal.Length, Sepal.Width, Petal.Length, Petal.Width,
        sep = '',remove=FALSE)

對於支持||的DBMS 串聯運算符(例如Oracle ),只需將concat_str定義替換為:

concat_str <- paste(dot_names, collapse = paste0(" || '", sep, "' || "))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM