如何将返回集的数据设置为null并运行其他select语句

时间:2019-01-16 15:40:40

标签: sql-server sql-server-2012

背景:

我有一条select语句,我在其中返回每一行。这本身是基本的,但是我遇到的问题是,如果该行中的一列读取 DENIED ,则现在所有行的所有数据都应设置为null,并且我需要返回一个全新的数据集。

我尝试过的事情:

我一直试图通过select语句中的case语句来处理此问题。这似乎不符合我的要求,因为case语句出错了。据我了解,不允许尝试运行差异选择语句或存储过程。

问题:

我不确定如何制定执行此操作的查询。案例陈述是正确的方法吗?临时表有帮助吗?

所需结果:

如果所有行的状态 SUBMITTED

  • 1、222,“信息”,“已提交”
  • 2、333,“更多信息”,“已提交”

如果至少一行具有 DENIED 作为其状态

  • null,null,来自另一个选择语句“ SUBMITTED”的数据
  • null,null,来自另一个选择语句“ DENIED”的数据

代码:

Select 
    id,
    licence,
    genericInfo,
    case
    when status = 'SUBMITTED' then
        status
    when status = 'DENIED' then
        'DENIED - Do stuff'
    end as 'Results'
from genericTable

3 个答案:

答案 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

我明白你的意思吗?