[英]CASE expression evaluation issue
I have a SQL query which computes CourseType based on Description as below. 我有一个SQL查询,它根据以下描述计算CourseType。
SELECT sc.EXSJ_Description,
sn.STEN_Student_ID , s.STUD_Forename_1, s.STUD_Surname,
CASE
WHEN sc.EXSJ_Description IN ('FUNCTIONAL SKILLS - ENGLISH (LEVEL 1 & LEVEL 2)',
'ENGLISH (ENTRY LEVEL)', 'FUNCTIONAL SKILLS ENGLISH') THEN 'Overall'
WHEN sc.EXSJ_Description IN ('READING -ENGLISH LEVEL 2', 'READING- ENGLISH (LEVEL 1 )',
'E2 ENGLISH FUNTIONAL SKILLS READING', 'E2 FUNCTIONAL SKILLS READING',
'E3 ENGLISH FUNTIONAL SKILLS READING')THEN 'Reading'
WHEN sc.EXSJ_Description IN ('WRITING- ENGLISH (LEVEL 1 )', 'WRITING- ENGLISH LEVEL 2',
'E2 ENGLISH FUNCTIONAL SKILLS WRITING', 'E3 ENGLISH FUNCTIONAL SKILLS WRITING')
THEN 'Writing'
WHEN sc.EXSJ_Description IN ('SPEAKING & LISTENING-
ENGLISH LEVEL 2', 'SPEAKING & LISTENING- ENGLISH (LEVEL 1)',
'E3 ENGLISH FUNCTIONAL SKILLS SPEAKING AND LISTENING',
'E2 ENGLISH FUNCTIONAL SKILLS SPEAKING AND LISTENING')
THEN 'Speaking & Listening'
END AS CourseType,
CASE WHEN e.EXSS_Act_Grade = 'PA' THEN 'Pass'
WHEN e.EXSS_Act_Grade = 'FL' THEN 'Fail'
WHEN e.EXSS_Act_Grade = 'X' THEN 'Not Attended' END AS Grade
FROM
sql10.NG.dbo.STEN AS sn
LEFT OUTER JOIN sql10.NG.dbo.EXSSexmstsbj AS e
ON e.EXSS_Student_ID = sn.STEN_Student_ID
AND sn.STEN_Provision_Code = e.EXSS_Provision_Code
AND sn.STEN_Provision_Instance = e.EXSS_Provision_Instance
INNER JOIN sql10.NG.dbo.STUDstudent AS s
ON s.STUD_Student_ID = sn.STEN_Student_ID
INNER JOIN sql10.NG.dbo.EXSJexsubject AS sc
ON sc.EXSJ_Subject_Code = e.EXSS_Subject_Code
WHERE (e.EXSS_Year = '2015')
AND (sn.STEN_Year = '2015')
AND (e.EXSS_Awarding_Body IN ('13', '73'))
AND (e.EXSS_Provision_Code LIKE 'MA27%')
AND (sn.STEN_Provision_Code LIKE '27%') OR
(sn.STEN_Provision_Code LIKE 'MA27%')
AND (sc.EXSJ_Description LIKE '%englis%')
GO
So there should be 3 Course Types - Overall, Reading or Writing but when I execute the query I see some NULL values which is not expected. 因此应该有3种课程类型-总体,阅读或写作,但是当我执行查询时,我看到了一些NULL值,这是不期望的。
Sample data: 样本数据:
CREATE TABLE [dbo].[STEN]( [STEN_ISN] [int] IDENTITY(1,1) NOT NULL, [STEN_Student_ID] [char](12) NOT NULL, [STEN_Year] [smallint] NOT NULL, [STEN_Provision_Code] [char](20) NOT NULL, [STEN_Provision_Instance] [char](6) NOT NULL) INSERT INTO [dbo].[STEN]( VALUES ('13068629', '2015', '27107', '151601'), ('14072552 ', '2015', '27107', '151601'), ('14073353', '2015', '27107', '151601'), ('14073645', '2015', '27107/DR01', '151601'), ('15075375', '2015', '27107/DR01', '151601'))
CREATE TABLE [dbo].[EXSSexmstsbj]( [EXSS_Year] [smallint] NOT NULL, [EXSS_Student_ID] [char](12) NOT NULL, [EXSS_Act_Grade] [char](6) NOT NULL, [EXSS_Awarding_Body] [char](16) NOT NULL, [EXSS_Provision_Code] [char] (20) NULL, [EXSS_Provision_Intance] [char] (6) NULL)) INSERT INTO dbo.EXSSexmstsbj VALUES ( 2015, '09054118','PA, '13', 'MA27031/A01', '151601'), ( 2015, '1261589','PA, '13', 'MA27031/A01', '151601'), ( 2015, '1364766','FL, '13', 'MA27031/A01', '151601'), ( 2015, '1365244','FL, '13', 'MA27031/A01', '151601'), ( 2015, '1260791','X, '13', 'MA27031/A01', '151601'),
CREATE TABLE [dbo].[PRPIProvisionInstance]( [PRPI_ISN] [int] IDENTITY(1,1) NOT NULL, [PRPI_Code] [char](20) NOT NULL, [PRPI_Instance] [char](6) NOT NULL) INSERT INTO [dbo].[PRPIProvisionInstance] VALUES ('19235','27107','151601'), ('19236','27107/DR01','151601'), ('19285','27113', '151601'), ('19286','27113/DR01','151601'), ('19237','27120','151601')
CREATE TABLE [dbo].[PRPHProvisionHeader]( [PRPH_Code] [char](20) NOT NULL, [PRPH_Title] [varchar](100) NOT NULL, [PRPH_ML2] [char](6) NOT NULL) INSERT INTO [dbo].[PRPHProvisionHeader]VALUES('27000', 'FS workshop for Art', 'A+D '), (27000/A01','FS workshop for Art','A+D '), ('27031/A01','FS English L2 (MA) (Pearson)',' WFD '), ('27032/A01','FS Maths L2 (MA) (Pearson)',' WFD ') , ('27100/E91','EDEX English E1 FS Sept Start (13195) Tue 6.00-9.00',' PLW ')
CREATE TABLE [dbo].[STUDstudent]( [STUD_Student_ID] [char](12) NOT NULL, [STUD_Surname] [varchar](30) NOT NULL, [STUD_Forename_1] [varchar](20) NOT NULL, ) INSERT INTO [dbo].[STUDstudent] ('703666V', 'Aakel','Gail'), ('472833M','Abbott','Emma'), ('481691M','Abbasi','Anisa'), '13072746','Ababio','Anita'), '13070877','Aaronson', 'Fay')
CREATE TABLE [dbo].[EXSJexsubject]( [EXSJ_Description] [varchar](100) NOT NULL, [EXSJ_Awarding_Body] [char](16) NOT NULL, ) INSERT INTO [dbo].[EXSJexsubject] VALUES ('E1 ENGLISH FUNCTIONAL SKILLS SPEAKING AND LISTENING', '13'), ('E1 ENGLISH FUNTIONAL SKILLS READING',' 13 '), ('E1 ENGLISH FUNCTIONAL SKILLS WRITING',' 13 '), ('E2 ENGLISH FUNCTIONAL SKILLS SPEAKING AND LISTENING','13'), ('E2 ENGLISH FUNTIONAL SKILLS READING',' 13 ')
CREATE TABLE [dbo].[GNUCustom]( [GNUC_Type] [char](4) NOT NULL, [GNUC_Entity_ISN] [int] NOT NULL, GNUC_Text_1 [VARCHAR] (100) NOT NULL) INSERT INTO VALUES (PRPI 571 PRPI 7761 PRPI 8292 PRPI 8346 PRPI 8374 )
Kindly suggest where am I going wrong. 请建议我要去哪里错了。
Thanks, Ar 谢谢Ar
I would guess that there are some other values within EXSJ_Description column that are not being picked up in your CASE WHEN
statements. 我猜想EXSJ_Description列中还有一些其他值未在您的
CASE WHEN
语句中使用。
Try this command see if it returns any non-null values: 尝试以下命令,看看是否返回任何非空值:
SELECT
EXSJ_Description
FROM
sql10.NG.dbo.EXSJexsubject
WHERE
EXSJ_Description
NOT IN
('FUNCTIONAL SKILLS - ENGLISH (LEVEL 1 & LEVEL 2)',
'ENGLISH (ENTRY LEVEL)',
'FUNCTIONAL SKILLS ENGLISH',
'WRITING- ENGLISH (LEVEL 1 )',
'WRITING- ENGLISH LEVEL 2',
'E2 ENGLISH FUNCTIONAL SKILLS WRITING',
'E3 ENGLISH FUNCTIONAL SKILLS WRITING',
'SPEAKING & LISTENING- ENGLISH LEVEL 2',
'SPEAKING & LISTENING- ENGLISH (LEVEL 1)',
'E3 ENGLISH FUNCTIONAL SKILLS SPEAKING AND LISTENING',
'E2 ENGLISH FUNCTIONAL SKILLS SPEAKING AND LISTENING')
If there are, add them to your conditions. 如果有,请将它们添加到您的条件中。 In the future, best practice dictates always using an
ELSE
to catch any unmatched values. 将来,最佳做法要求始终使用
ELSE
来捕获任何不匹配的值。
If they are all null, your joins are probably causing a duplication of data that's creating extra null values. 如果它们全为空,则您的联接可能导致重复数据,从而创建了额外的空值。 Without your data set it's hard to tell for sure.
没有您的数据集,很难确定。
Although using exact matches may be desirable in some cases, having lists of exact matches offers the opportunity for typos and may cause maintenance problems in the future. 尽管在某些情况下可能需要使用完全匹配,但是拥有完全匹配的列表将为您提供错别字的机会,并且将来可能会导致维护问题。
You might consider using pattern matching here to make the code easier to follow: 您可以考虑在此处使用模式匹配,以使代码更易于遵循:
(CASE WHEN sc.EXSJ_Description LIKE 'FUNCTIONAL%' OR
sc.EXSJ_Description LIKE '%ENTRY%'
THEN 'Overall'
WHEN sc.EXSJ_Description LIKE '%READING%'
THEN 'Reading'
WHEN sc.EXSJ_Description LIKE '%WRITING%'
THEN 'Writing'
WHEN sc.EXSJ_Description LIKE '%SPEAKING%LISTENING%'
THEN 'Speaking & Listening'
ELSE 'Unknown'
END) AS CourseType,
Admittedly, this will not work for all naming conventions (if a description has both READING
and WRITING
, then what?). 不可否认,这不适用于所有命名约定(如果描述同时具有
READING
和WRITING
,那又如何?)。 But it does work for your particular set of names and it reduces the opportunities for a typo, which caused your original problem. 但这确实适用于您的特定名称集,并且减少了出现错字的机会,这造成了您的原始问题。
Try this, but not good from performance perspective 尝试一下,但从性能角度来看效果不佳
CASE
WHEN REPLACE(sc.EXSJ_Description,' ','') IN (
REPLACE('FUNCTIONAL SKILLS - ENGLISH (LEVEL 1 & LEVEL 2)',' ',''),
REPLACE('ENGLISH (ENTRY LEVEL)',' ',''),
REPLACE('FUNCTIONAL SKILLS ENGLISH',' ','')
) THEN 'Overall'
WHEN REPLACE(sc.EXSJ_Description,' ','') IN (
REPLACE('READING -ENGLISH LEVEL 2',' ',''),
REPLACE('READING- ENGLISH (LEVEL 1 )',' ',''),
REPLACE('E2 ENGLISH FUNTIONAL SKILLS READING',' ',''),
REPLACE('E2 FUNCTIONAL SKILLS READING',' ','')
REPLACE('E3 ENGLISH FUNTIONAL SKILLS READING',' ','')
)THEN 'Reading'
WHEN REPLACE(sc.EXSJ_Description,' ','') IN (
REPLACE('WRITING- ENGLISH (LEVEL 1 )',' ',''),
REPLACE('WRITING- ENGLISH LEVEL 2',' ',''),
REPLACE('E2 ENGLISH FUNCTIONAL SKILLS WRITING',' ',''),
REPLACE('E3 ENGLISH FUNCTIONAL SKILLS WRITING',' ','')
)THEN 'Writing'
...
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.