SQL - если одна запись имеет конкретное значение, получить только это, если не получить все - PullRequest
0 голосов
/ 06 июня 2019

У меня есть этот запрос, который возвращает несколько записей, если одно из значений в столбце равно числу, я хочу иметь только эту конкретную запись, если нет, я хочу иметь все записи.

Я пытался использовать некоторые подзапросы для достижения этой цели, но я не так хорош в SQL.

Select       
    Material_Number,
    Supplier_Number,
    CODE
from 
    w_supp_ds
    where 
     Material_Number = '111111'

для этого Material_Number У меня есть этот вывод

111111  1015221     blank
111111  1071384     blank

что хорошо!

Но если я получу вывод, подобный этому:

222222  1074556     2
222222  1001297     blank

Я хочу только первую запись. Таким образом, если одна запись содержит числовое значение в столбце Код, я получаю его, если нет, то мне нужны два пробела. Таким образом, я не могу использовать что-то вроде WHERE IsNumeric (Code)

Ответы [ 4 ]

1 голос
/ 06 июня 2019

Один метод - это условие not exists:

select . . .
from w_supp_ds w
where Material_Number = '111111' or
      not exists (select 1 from w_supp_ds w2 where w2.Material_Number = '111111')
0 голосов
/ 28 июня 2019

Попробуйте это:

SELECT
    MATERIAL_NUMBER,
    SUPPLIER_NUMBER,
    CODE
FROM
    (
        SELECT
            MATERIAL_NUMBER,
            SUPPLIER_NUMBER,
            CODE,
            COUNT(CODE) OVER(
                PARTITION BY MATERIAL_NUMBER
            ) M
        FROM
            W_SUPP_DS
        WHERE
            MATERIAL_NUMBER = '111111' --222222
    )
WHERE
    M = 0
    OR ( CODE IS NOT NULL )

Демо

Ура !!

0 голосов
/ 07 июня 2019

С оператором CASE в предложении WHERE:

Select       
  Material_Number,
  Supplier_Number,
  CODE
from w_supp_ds
where 
  Material_Number = '??????'
  and coalesce(CODE, '0') = case 
    when exists (select 1 from w_supp_ds where Material_Number = '??????' and CODE is not null) then CODE
    else '0'
  end

См. Демоверсию .Результаты для Material_Number = '111111':

> MATERIAL_NUMBER | SUPPLIER_NUMBER | CODE
> :-------------- | :-------------- | :---
> 111111          | 1015221         | null
> 111111          | 1071384         | null

Результаты для Material_Number = '222222':

> MATERIAL_NUMBER | SUPPLIER_NUMBER | CODE
> :-------------- | :-------------- | :---
> 222222          | 1074556         | 2   
0 голосов
/ 06 июня 2019

Если я вас правильно понял, аналитическая функция RANK может помочь:

SQL> with w_supp_ds (material_number, supplier_number, code) as
  2    (select 111111, 1015221, null from dual union all
  3     select 111111, 1071384, null from dual union all
  4     --
  5     select 222222, 1074556, 2    from dual union all
  6     select 222222, 1001297, null from dual
  7    ),
  8  temp as
  9    (select material_number, supplier_number, code,
 10        rank() over (order by code desc nulls last) rn
 11     from w_supp_ds w
 12     where Material_Number = &par_mat_num
 13    )
 14  select material_number, supplier_number, code
 15  from temp
 16  where rn = 1;
Enter value for par_mat_num: 111111

MATERIAL_NUMBER SUPPLIER_NUMBER       CODE
--------------- --------------- ----------
         111111         1015221
         111111         1071384

SQL> /
Enter value for par_mat_num: 222222

MATERIAL_NUMBER SUPPLIER_NUMBER       CODE
--------------- --------------- ----------
         222222         1074556          2

SQL>
...