为什么变量和条件的结果不同?

时间:2015-11-18 22:02:48

标签: sql tsql

我想知道这个问题。

在下面的查询中,我试图选择@transcript作为2列值的组合。但是当我在select语句中使用这个变量时,我只得到3个结果(实际输出应该是8个结果)。当我在select语句中直接使用条件时获得实际输出。

任何人都可以帮我解决这个问题。

declare @transcript varchar(10)
select @transcript = [CAREER_CD]+[CAREER_SUFX_CD] from dbo.SR0DAT
select DISTINCT @transcript transcriptCareerCode, 
case @transcript
     when 'U1' then 'BACCALAUREATE'
     when 'U2' then 'SECOND BACCALAUREATE'
     when 'G1' then 'GRADUATE'
     when 'L1' then 'LAW'
     when 'D1' then 'DENTISTRY'
     when 'M1' then 'MEDICINE'
     when 'IU' then 'transcriptCareerName'
     when 'IG' then 'IEO Graduate'
     end as transcriptCareerName
from dbo.SR0DAT
WHERE @transcript <>'G2'
union
select 'IU','IEO Undergraduate'
union
select 'IG','IEO Graduate'

输出:

transcriptCareerCode    transcriptCareerName
G1  GRADUATE
IG  IEO Graduate
IU  IEO Undergraduate

第二段代码:

select DISTINCT [CAREER_CD]+[CAREER_SUFX_CD] transcriptCareerCode, 
case [CAREER_CD]+[CAREER_SUFX_CD]
     when 'U1' then 'BACCALAUREATE'
     when 'U2' then 'SECOND BACCALAUREATE'
     when 'G1' then 'GRADUATE'
     when 'L1' then 'LAW'
     when 'D1' then 'DENTISTRY'
     when 'M1' then 'MEDICINE'
     when 'IU' then 'transcriptCareerName'
     when 'IG' then 'IEO Graduate'
     end as transcriptCareerName
from dbo.SR0DAT
WHERE [CAREER_CD]+[CAREER_SUFX_CD] !='G2'
union
select 'IU','IEO Undergraduate'
union
select 'IG','IEO Graduate'

输出:

transcriptCareerCode    transcriptCareerName
D1  DENTISTRY
G1  GRADUATE
IG  IEO Graduate
IU  IEO Undergraduate
L1  LAW
M1  MEDICINE
U1  BACCALAUREATE
U2  SECOND BACCALAUREATE

2 个答案:

答案 0 :(得分:1)

在第一个查询中,您将通过变量@transcript创建一个奇异值。结果,您致电:

select @transcript = [CAREER_CD]+[CAREER_SUFX_CD] from dbo.SR0DAT

仅保证SELECT语句中的最后一条记录被分配给@transcript变量。

因此,该查询中只会返回一行(您在第一个示例中已经联合了另外两行)。

第二个例子是使用实际的数据库集逻辑来引入集合中的值 - 而不仅仅是集合中的最后一个值。

答案 1 :(得分:1)

虽然两个查询确实是针对您的表运行的,但在第一个查询中根本没有使用任何列:对于每一行,您只需返回一个固定/常量表达式。 distinct选项有助于掩盖所发生的事情,如果删除了该选项,您将会看到所有正在折叠成一行的多个副本。如果你也说select @transcript, * ...,你也会看到其他数据的位置。

您是否只是想为transcript表达式创建一个别名,这样您就不必重复它了?

with T as (
    select CAREER_CD + CAREER_SUFX_CD as transcript
    from dbo.SR0DAT
)
select DISTINCT
    transcript transcriptCareerCode, 
    case transcript
        when 'U1' then 'BACCALAUREATE'
        when 'U2' then 'SECOND BACCALAUREATE'
        when 'G1' then 'GRADUATE'
        when 'L1' then 'LAW'
        when 'D1' then 'DENTISTRY'
        when 'M1' then 'MEDICINE'
        when 'IU' then 'transcriptCareerName'
        when 'IG' then 'IEO Graduate'
    end as transcriptCareerName
from T
where transcript <> 'G2'
union
select 'IU', 'IEO Undergraduate'
union
select 'IG', 'IEO Graduate'