我有一条select语句,我在其中返回每一行。这本身是基本的,但是我遇到的问题是,如果该行中的一列读取 DENIED ,则现在所有行的所有数据都应设置为null,并且我需要返回一个全新的数据集。
我一直试图通过select语句中的case语句来处理此问题。这似乎不符合我的要求,因为case语句出错了。据我了解,不允许尝试运行差异选择语句或存储过程。
我不确定如何制定执行此操作的查询。案例陈述是正确的方法吗?临时表有帮助吗?
如果所有行的状态为 SUBMITTED :
如果至少一行具有 DENIED 作为其状态
Select
id,
licence,
genericInfo,
case
when status = 'SUBMITTED' then
status
when status = 'DENIED' then
'DENIED - Do stuff'
end as 'Results'
from genericTable
答案 0 :(得分:2)
保留“提交的”记录完整并修改“拒绝的”记录吗?
设置:
Create Table genericTable
(
id Int,
licence Int,
genericInfo VarChar(50),
status VarChar(25)
)
Insert Into genericTable Values
(1,222,'Info','SUBMITTED'),
(2,333,'Info','SUBMITTED'),
(3,444,'More Info','DENIED')
TSQL
Select * From genericTable Where status = 'SUBMITTED'
Union All
Select NULL,NULL,NULL,'DENIED - Do Stuff' From genericTable Where [status] = 'DENIED'
结果
id licence genericInfo status
1 222 Info SUBMITTED
2 333 Info SUBMITTED
NULL NULL NULL DENIED - Do Stuff
答案 1 :(得分:1)
因为关键是如果ANY记录是'DENIED',那么在CTE中构建数据并在不存在DENIED的情况下按常规返回数据,但是如果有任何DENIED,则在其中返回NULL。
由于EXISTS和NOT EXISTS是互斥的,因此您总是会得到一个或另一个输出,但不会两者都
;WITH CTE AS
(Select
id,
licence,
genericInfo,
status
from genericTable
)
SELECT * FROM CTE WHERE NOT EXIST (SELECT C2.* FROM CTE C2 WHERE C2.status = 'DENIED')
UNION ALL
SELECT null id, null licence, null genericinfo, c3.status
FROM CTE c3 WHERE EXISTS (SELECT C4.* FROM CTE C4 WHERE C4.status = 'DENIED')
我已经使用UNION完成了此操作,但是我只会返回UNION的一半
答案 2 :(得分:0)
好吧,我不知道我是否正确理解你。 一个选择语句,以防统计数据对性能不利,但仍然可行。 这是一个测试。
Select
id,
licence,
genericInfo,
case
when (select count(*) from genericTable where status = 'DENIED') <= 0 and status = 'SUBMITTED' then
status
when (select count(*) from genericTable where status = 'DENIED') > 0 then
'DENIED - Do stuff'
end as 'Results'
from genericTable
我明白你的意思吗?