SQL - 如果一条记录具有特定值,则仅获取该记录,否则获取全部

Posted

技术标签:

【中文标题】SQL - 如果一条记录具有特定值,则仅获取该记录,否则获取全部【英文标题】:SQL - If one record has a specific value get only that one, if not get all 【发布时间】: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) 之类的东西

【问题讨论】:

【参考方案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

干杯!!

【讨论】:

以上是关于SQL - 如果一条记录具有特定值,则仅获取该记录,否则获取全部的主要内容,如果未能解决你的问题,请参考以下文章

如果急切加载的值具有价值,则仅返回雄辩的结果?

当值与 SQL Server 中的最后一条记录之间存在特定差距时如何选择值

以准确的 MAX 顺序获取特定时间戳之间具有 MAX 值的记录

如何使用 xslt 获取与特定元素值匹配的最后一条记录?

插入该特定值更改的记录

SQL如何获取上一条..下一条..首尾记录...