[英]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.frames
, tidyr::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.