Может ли dplyr для SQL перевести == NA в IS NULL в фильтрах? - PullRequest
1 голос
/ 01 апреля 2019

Я пытаюсь использовать 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, I 'мне бы хотелось, чтобы переведенный запрос был:

SELECT Id FROM My_Table WHERE Elem1 == 1 AND Elem2 IS NULL AND Elem3 == 3

Однако мой код выше преобразует предложение where в ... AND Elem2 == NULL ..., что, очевидно, не выполняет то, что я хочу.Есть хороший способ решить эту проблему?

1 Ответ

0 голосов
/ 02 апреля 2019

Предполагая, что вы находитесь на 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 выбрано так, что оно имеет тот же тип данных (текст / цифра /date) в качестве столбцов набора данных, но не является значением, которое в настоящее время отображается в столбцах набора данных.

Функция COALESCE возвращает первое ненулевое значение из списка аргументов.Итак, сначала мы заменим NULL в столбцах Elem_ заполнителем, а затем заменим NULL в значениях elem_ на тот же заполнитель.Следовательно, стандартное == сравнение имеет смысл.

Одна из ключевых идей здесь состоит в том, что, поскольку COALESCE не имеет определенного перевода с R на SQL, он остается при переводе кода R на SQL,См. этот вопрос для получения дополнительной информации / альтернативы.

...