我想将小学分配到9岁以下和9年级及以上的小学,同时将学前班录为同样的
答案 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
,它由字符串值组成。此值将等于数字,即少数可接受字符串之一(即PreSchool
,Voc Yr1
和Voc Yr2
),或以某种方式无效。
我已经开始测试,看看Class_Year
是否等于其中一个可接受的字符串。通过消除这些可能性,测试以查看Class_Year
的值是否代表数字变得更容易。我使用ISNUMERIC( Class_Year ) <> 1
来测试Class_Year
是否不表示数字,并在这种情况下返回值NULL
。如果Class_Year
的值代表一个数字,则根据该数字的值返回Primary
或Secondary
,这是我通过转换值获得的将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
子句后允许的字段创建WHERE
,SELECT
}子句将无法引用它。解决此问题的一种方法是从我的答案开头使用我的语句作为子查询到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)
函数上)