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 中的最后一条记录之间存在特定差距时如何选择值