Скорее всего, не хватает чего-то действительно очевидного, но я пытаюсь отфильтровать результаты своего запроса в GBQ. В приведенном ниже примере я хотел бы отфильтровать результаты, в которых invamt имеет значение NULL. Однако я хочу сохранить любые результаты, в которых invamt равно 0, а order amt не равно 0

DATA
  csr | inv amt| order amt  |  
-----------------------------
 bob  |  12,00 |     0      |
 bil  |   0    |     0      |
 art  |   0    |     0      |
 tia  |   0    |     12     |

OUTPUT
  csr | inv amt| order amt  |  
-----------------------------
 bob  |  12,00 |     0      |
 tia  |   0    |     12     |

Я пытался where invamt <> 0 and not (invamt = 0 and orderamt > 0) , но, похоже, не дает мне правильных результатов. Есть идеи?

Изменить: извинения - используются результаты NULL и 0 взаимозаменяемо. Определенно не то же самое

0
alynn 29 Авг 2020 в 18:52

2 ответа

Лучший ответ

BigQuery Стандартный SQL

Предполагая (из контекста вопроса и имени полей), что вы имеете дело не с отрицательными числами и фактическими NULL, а только с нулевыми и положительными числами:

#standardSQL
SELECT *
FROM `project.dataset.data`
WHERE inv_amt + order_amt > 0   

Если применить к образцу данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.data` AS (
  SELECT 'bob' csr, 12.00 inv_amt, 0 order_amt UNION ALL
  SELECT 'bil', 0, 0 UNION ALL
  SELECT 'art', 0, 0 UNION ALL
  SELECT 'tia', 0, 12 
)
SELECT *
FROM `project.dataset.data`
WHERE inv_amt + order_amt > 0   

Выход

Row csr     inv_amt     order_amt    
1   bob     12.0        0    
2   tia     0.0         12      

Другой вариант [ниже] предназначен для развлечения и обучения [надеюсь, для вас] опыта.

#standardSQL
SELECT *
FROM `project.dataset.data`
WHERE REGEXP_CONTAINS(FORMAT('%t', STRUCT(inv_amt, order_amt)), r'[123456789]')
0
Mikhail Berlyant 29 Авг 2020 в 17:24

Судя по вашим выборочным данным, вам просто нужно:

where invamt <> 0 or orderamt <> 0

На основании вашего вопроса:

Я хотел бы отфильтровать результаты, в которых invamt имеет значение null. Однако я хочу сохранить любые результаты, в которых invamt имеет значение null, но amt порядка не равно null

Вы, кажется, хотите:

where invamt is not null or orderamt is not null

Если возможны как NULL, так и 0, этого должно быть достаточно:

where invamt <> 0 or orderamt <> 0 

Это гарантирует, что один из столбцов имеет значение не - NULL, не - 0.

0
Gordon Linoff 29 Авг 2020 в 15:56