SQL Case语句数字和变量

时间:2017-05-01 00:40:21

标签: sql sql-server

SQL

我想将小学分配到9岁以下和9年级及以上的小学,同时将学前班录为同样的

1 个答案:

答案 0 :(得分:0)

请尝试以下方法......

SELECT Student_Subject_Type_Desc,
       Class_Year,
       CASE
           WHEN Class_Year = 'PreSchool' THEN
               'PreSec'
           WHEN Class_Year = 'Voc Yr1' THEN
               'Voc_Yr1'
           WHEN Class_Year = 'Voc Yr2' THEN
               'Voc_Yr2'
           WHEN ISNUMERIC( Class_Year ) <> 1 THEN
               NULL
           WHEN CAST( Class_Year AS INT ) < 9 then
               'Primary'
           ELSE
               'Secondary'
       END AS SchType
FROM FILNA.dbo.VIEW_FILNA_STUDENTS_SUBJECT
ORDER BY Student_Subject_Type_Desc
LIMIT 1000

CASE语句基于Class_Year,它由字符串值组成。此值将等于数字,即少数可接受字符串之一(即PreSchoolVoc Yr1Voc Yr2),或以某种方式无效。

我已经开始测试,看看Class_Year是否等于其中一个可接受的字符串。通过消除这些可能性,测试以查看Class_Year的值是否代表数字变得更容易。我使用ISNUMERIC( Class_Year ) <> 1来测试Class_Year是否表示数字,并在这种情况下返回值NULL。如果Class_Year 的值代表一个数字,则根据该数字的值返回PrimarySecondary,这是我通过转换值获得的将Class_Year加入INT

请注意,从您的问题中不清楚Class_Year 0的{​​{1}}值,负数,太大数字和非整数等值实数应该如何处理,所以我假设它们不会发生或不需要进行测试。如果确实需要进行测试,请修改您的问题。另外,如果您希望我测试过大的数字,请说明最大有效数字是什么。

附录

至于第二篇评论中的第二篇文章,你提供的代码是......

SELECT Student_Subject_Type_Desc,
       Class_Year,
       CASE
           WHEN Class_Year = 'PreSchool' THEN
               'PreSec'
           WHEN Class_Year = 'Voc Yr1' THEN
               'Voc_Yr1'
           WHEN Class_Year = 'Voc Yr2' THEN
               'Voc_Yr2'
           WHEN ISNUMERIC( Class_Year ) <> 1 THEN
               NULL
           WHEN CAST( Class_Year AS INT ) < 9 then
               'Primary'
           ELSE
               'Secondary'
       END AS SchType
FROM [FILNA].[dbo].[Student_Subject_Desc]
WHERE SchType = 'Primary'
ORDER BY Student_Subject_Type_Desc

由于SchType是我们使用CASE语句创建的字段,我们使用应用WHERE子句后允许的字段创建WHERESELECT }子句将无法引用它。解决此问题的一种方法是从我的答案开头使用我的语句作为子查询到WHERE语句,该语句将返回受SELECT Student_Subject_Type_Desc, Class_Year, SchType FROM ( SELECT Student_Subject_Type_Desc, Class_Year, CASE WHEN Class_Year = 'PreSchool' THEN 'PreSec' WHEN Class_Year = 'Voc Yr1' THEN 'Voc_Yr1' WHEN Class_Year = 'Voc Yr2' THEN 'Voc_Yr2' WHEN ISNUMERIC( Class_Year ) <> 1 THEN NULL WHEN CAST( Class_Year AS INT ) < 9 then 'Primary' ELSE 'Secondary' END AS SchType FROM FILNA.dbo.VIEW_FILNA_STUDENTS_SUBJECT ) AS SchTypeFinder WHERE SchType = `Primary` ORDER BY Student_Subject_Type_Desc LIMIT 1000 子句约束的所有字段。例如......

SELECT Student_Subject_Type_Desc,
       Class_Year,
       'Primary' AS SchType
FROM [FILNA].[dbo].[Student_Subject_Desc]
WHERE ISNUMERIC( Class_Year ) = 1
  AND CAST( Class_Year AS INT ) < 9
ORDER BY Student_Subject_Type_Desc
LIMIT 1000

但是,这比将声明更改为此表单效率低......

SELECT

这只会Class_Year只有9代表小于SchType = 'Primary'的数字的记录,即只有那些符合CASE的数字。这消除了对Primary语句的任何需求,并使我们始终可以SchType返回INT

如果您有任何问题或意见,请随时发表评论。

进一步阅读

Convert a string to int using sql query(将字符串转换为ISNUMERIC()

https://docs.microsoft.com/en-us/sql/t-sql/functions/isnumeric-transact-sql(在drawImage(source, sx, sy, sw, sh, dx, dy, dw, dh)函数上)