我正在尝试使用dplyr查询SQL数据库,并匹配提供的参数。
id <- tbl(conn, "My_Table") %>%
filter(Elem1 == elem1 & Elem2 == elem2 & Elem3 == elem3) %>%
select(Id) %>%
collect()
但是,elem1
,elem2
或elem3
中的任何一个都可能是NA。理想情况下,我希望查询将其转换为SQL IS NULL
语句。
例如,如果elem1
为1,elem2
为NA,而elem3
为3,我希望翻译后的查询为:
SELECT Id FROM My_Table WHERE Elem1 == 1 AND Elem2 IS NULL AND Elem3 == 3
但是,我上面的代码将where子句转换为... AND Elem2 == NULL ...
,这显然不能满足我的要求。有解决这个问题的好方法吗?
答案 0 :(得分:0)
假设您在SQL服务器中,则可以像这样使用COALESCE
绕过此操作:
filler_value = -1
id <- tbl(conn, "My_Table") %>%
mutate(Elem1 = COALESCE(Elem1, filler_value),
Elem2 = COALESCE(Elem2, filler_value),
Elem3 = COALESCE(Elem3, filler_value)) %>%
filter(Elem1 == COALESCE(elem1, filler_value),
Elem2 == COALESCE(elem2, filler_value),
Elem3 == COALESCE(elem3, filler_value)) %>%
select(Id) %>%
collect()
在选择filler_value
的地方,使其与数据集列具有相同的数据类型(文本/数字/日期),但不是当前出现在数据集列中的值。
COALESCE
函数从其参数列表返回第一个非空值。因此,我们首先用占位符替换NULL
列中的Elem_
,然后用相同的占位符替换NULL
值中的elem_
。因此,标准的==
比较是有意义的。
这里的关键思想之一是,由于COALESCE
没有定义R到SQL的转换,因此当R代码转换为SQL时它会保留下来。有关更多详细信息/替代内容,请参见this问题。