简体   繁体   English

CASE表达评估问题

[英]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值,这是不期望的。

SQL查询结果NULL CourseType

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?). 不可否认,这不适用于所有命名约定(如果描述同时具有READINGWRITING ,那又如何?)。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM