【问题标题】:SQL - If one record has a specific value get only that one, if not get allSQL - 如果一条记录具有特定值,则仅获取该记录,否则获取全部
【发布时间】:2019-06-06 17:12:16
【问题描述】:

我有这个返回多条记录的查询,如果一列中的一个值等于一个数字,我只想拥有那条特定的记录,否则我想拥有所有记录。

我尝试使用一些子查询来实现它,但我的 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) 之类的东西

【问题讨论】:

    标签: sql oracle oracle10g oracle-sqldeveloper


    【解决方案1】:

    一种方法是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')
    

    【讨论】:

    • 感谢您的反馈,但没有奏效,我得到了完全相同的输出。
    • @HoracioPires 。 . .我相信这准确地回答了您提出的问题:“如果列中的一个值等于一个数字,我只想拥有该特定记录,否则我想拥有所有记录。”。跨度>
    【解决方案2】:

    如果我理解正确,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>
    

    【讨论】:

      【解决方案3】:

      在 WHERE 子句中使用 CASE 语句:

      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
      

      请参阅demo
      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   
      

      【讨论】:

        【解决方案4】:

        试试这个:

        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 )
        

        Demo

        干杯!!

        【讨论】:

          猜你喜欢
          • 2014-11-08
          • 1970-01-01
          • 1970-01-01
          • 2020-10-09
          • 2020-06-24
          • 2019-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多