代码之家  ›  专栏  ›  技术社区  ›  Simon.S.A.

在SQL Server中结合使用dbplyr和case\u

  •  3
  • Simon.S.A.  · 技术社区  · 7 年前

    我正在使用dbplyr在SQL Server中编写和运行查询,并希望应用条件变异。这可以用 ifelse 或使用 case_when . 当使用 但使用时抛出和异常 案件发生时间 .

    问题似乎是这两个命令被转换成的SQL语法。这个 案件发生时间 语法似乎不是有效的SQL。你能告诉我为什么和怎样修理吗?还是虫子?

    # libraries
    library(DBI)
    library(dplyr)
    library(dbplyr)
    
    # establish connection to database table
    connection_string = "database.specific.string"
    # mine looks something like "DRIVER=...; Trusted_Connection=...; DATABASE=...' SERVER=..."
    db_connection = dbConnect(odbc::odbc(), .connection_string = connection_string)
    my_table = tbl(db_connection, from = my_table_name)
    
    # attempted query
    tmp = my_table %>%
        mutate(new_col = case_when(col1 == col2 ~ "a",
                                   col1 != col2 ~ "b"))
    
    # check SQL code for query
    show_query(tmp)
    

    SELECT 
        col1, col2,
        CASE
           WHEN CONVERT(BIT, IIF(col1 = col2, 1.0, 0.0))) THEN ('a')
           WHEN CONVERT(BIT, IIF(col1 <> col2, 1.0, 0.0))) THEN ('b')
        END AS new_col
    FROM my_database.my_table_name
    

    运行此代码会引发错误

    在“THEN”附近的上下文中指定的非布尔类型表达式

    然而 查询按预期工作:

    # attempted query
    tmp = my_table %>%
        mutate(new_col = ifelse(col1 == col2, "a", "b"))
    
    # check SQL code for query
    show_query(tmp)
    

    生成的SQL查询是:

    SELECT 
        col1, col2,
        CASE
           WHEN (CONVERT(BIT, IIF(col1 = col2, 1.0, 0.0))) = TRUE) THEN ('a')
           WHEN (CONVERT(BIT, IIF(col1 = col2, 1.0, 0.0))) = FALSE) THEN ('b')
        END AS new_col
    FROM my_database.my_table_name
    

    注意,在这两种情况下,SQL语法都是使用 show_query . 使用 translate_sql

    还有人得到这些SQL查询吗?有什么问题以及如何解决的建议吗?

    更新

    issue on the tidyverse 并被告知已经为 case_when(..., TRUE ~ "b") ELSE 'b' ( here

    但是,这并没有解决导致此异常的语法问题。对问题进行了编辑,重点是语法,这是原因。

    更新2

    issue on dbplyr . Christophe Dervieux(cderv)的响应指出,原因似乎是SQL server需要对 案件发生时间 如果有的话 .

    同时,用户可以使用多个 if_else 声明。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Shinobi_Atobe    7 年前

    只是你的dplyr语法有点错误?

    试试这个

    # attempted query
    tmp = my_table %>%
        mutate(new_col = case_when(col1 == col2 ~ "a",
                                   col1 == 'TRUE' ~ "b"
                  # alternatively  col1 == 1 ~ "b"
    )) 
    
        2
  •  0
  •   Simon.S.A.    7 年前

    见上文更新2:

    这似乎是一个影响 case_when 对于SQL server。

    ifelse if_else 声明:

    data %>%
        mutate(new_col = ifelse(condition1, val1, NA)) %>%
        mutate(new_col = ifelse(is.na(new_col) & condition2, val2, new_col)) %>%
        mutate(new_col = ifelse(is.na(new_col) & condition3, val3, new_col))
        # etc