Каков наиболее эффективный способ найти строки, в которых 3 столбца не равны нулю? - PullRequest
0 голосов
/ 08 января 2020

Мой коллега обратился ко мне за помощью в написании запроса, и вопрос был таков:

Как я могу вернуть все строки таблицы, где все три столбца B, C и D не являются нулевыми, и все они содержат положительные или отрицательные числа.

Я быстро дал ему следующее предложение where, которое, по его словам, удовлетворяет его потребностям, но я не могу проверить, так как у меня нет доступа к этим данным. c база данных. Это то, что я сказал ему попробовать:

select * from table_name
where ( nvl(B,0) + nvl(C,0) + nvl(D,0) ) <> 0 ;

Это было с моей головы пару дней назад, но я снова увидел это в своем электронном письме, так что теперь мне действительно любопытно, есть ли какие-то вопиющие очевидный способ, что было бы лучше сделать sh это то, что я пропускаю?

Ответы [ 3 ]

3 голосов
/ 08 января 2020

Если я правильно понимаю, вы можете просто использовать:

select t.*
from t
where a <> 0 and b <> 0 and c <> 0;

<> отфильтровывает NULL значения и нули.

Вопрос может быть неоднозначным и действительно таковым является знаки все одинаковые. Если так:

where (a > 0 and b > 0 and c > 0) or
      (a < 0 and b < 0 and c < 0)
1 голос
/ 08 января 2020

, так как вам нужны строки, в которых некоторые столбцы могут быть нулевыми, но не всеми, попробуйте следующее выражение "where"

where a <> 0 or b <> 0 or c <> 0;

, которое приведет вас к любым строкам, в которых хотя бы один столбец не равен нулю

0 голосов
/ 09 января 2020
with t (b,c,d) as (
select null,null,null from dual union all
select null,null,1    from dual union all
select null,1,2       from dual union all
select 1,2,3          from dual union all
select 2,2,2          from dual 
)
select * from t where coalesce(b, c, d) is not null
...