如何在不产生错误的情况下从 varchar 中提取整数
How to extract an integer from a varchar without creating an error
我需要构建一个查询并提供一个包含学生人数和学生类型的 class 列表。但是,在这个特定的学校中,一个 class 可以包含一个或多个学校级别。例如,某些学生倾向于在某些学校级别之间接受相同的 class 教学。例如某些残疾学生。特殊学生可以和其他学生一起上课。
我需要那个 class 的优势学校水平。检索该级别的唯一方法是基于 class 名称。
所以我有以下 table
Class
No.ofStudents
School Levels
No.ofSpecialStudents
No.ofhandicappedstudents
1A
25
0,1
5
0
1B
22
0,1
7
0
2A
26
2
5
0
2B
23
2
5
0
3A
28
3
4
0
3B
27
3
3
0
NVSK
12
0,1,2
0
12
这份榜单是我所拥有的样本。现在我需要生成如下列表
Class
MainSchoollevel
No.ofStudents
SchoolLevels
No.ofSp.Students
No.ofHCstudents
1A
1
25
0,1
5
0
1B
1
22
0,1
7
0
2A
2
26
2
5
0
2B
2
23
2
5
0
3A
3
28
3
4
0
3B
3
27
3
3
0
NVSK
null
12
0,1,2
0
12
我如何才能创建一个名为 Main school Level(int 类型)的字段,它可以从 classname 中提取第一个值,然后将其转换为数字字段?
您可能已经注意到,列表中还有一个名为 'NVSK' 的 class,它无法转换为数字,那么我如何才能放置一个空值呢?这种情况最适合使用哪种技术?
这里是查询的形式
select c.shortname as Classname, //varchar type
// as "MainSchoolLevel"
count(s.studentid) as "No.ofStudents",
string_agg(distinct cast(l.shorttext as varchar(4)), ', ') as "SchoolLevels",
sum(case when s.specialstudent true then 1 else 0 end) as "No.ofSpecialStudents",
sum(case when s.handicappedstudent true then 1 else 0 end) as "No.ofhandicappedStudents",
from student s
join studentclass sc on sc.studentid = sc.id
join class c on c.id = sc.classid
join classlevel cl on cl.classid = c.id
join level on l.id = cl.levelid
尝试通过正则表达式提取值并将它们分配给新列
select
class,
(coalesce (substring (class, '^\d+'), '') as num_class,
(coalesce (substring (class, '[A-Za-z]+'), '') as str_class,
from student s ....
我需要构建一个查询并提供一个包含学生人数和学生类型的 class 列表。但是,在这个特定的学校中,一个 class 可以包含一个或多个学校级别。例如,某些学生倾向于在某些学校级别之间接受相同的 class 教学。例如某些残疾学生。特殊学生可以和其他学生一起上课。 我需要那个 class 的优势学校水平。检索该级别的唯一方法是基于 class 名称。 所以我有以下 table
Class | No.ofStudents | School Levels | No.ofSpecialStudents | No.ofhandicappedstudents |
---|---|---|---|---|
1A | 25 | 0,1 | 5 | 0 |
1B | 22 | 0,1 | 7 | 0 |
2A | 26 | 2 | 5 | 0 |
2B | 23 | 2 | 5 | 0 |
3A | 28 | 3 | 4 | 0 |
3B | 27 | 3 | 3 | 0 |
NVSK | 12 | 0,1,2 | 0 | 12 |
这份榜单是我所拥有的样本。现在我需要生成如下列表
Class | MainSchoollevel | No.ofStudents | SchoolLevels | No.ofSp.Students | No.ofHCstudents |
---|---|---|---|---|---|
1A | 1 | 25 | 0,1 | 5 | 0 |
1B | 1 | 22 | 0,1 | 7 | 0 |
2A | 2 | 26 | 2 | 5 | 0 |
2B | 2 | 23 | 2 | 5 | 0 |
3A | 3 | 28 | 3 | 4 | 0 |
3B | 3 | 27 | 3 | 3 | 0 |
NVSK | null | 12 | 0,1,2 | 0 | 12 |
我如何才能创建一个名为 Main school Level(int 类型)的字段,它可以从 classname 中提取第一个值,然后将其转换为数字字段?
您可能已经注意到,列表中还有一个名为 'NVSK' 的 class,它无法转换为数字,那么我如何才能放置一个空值呢?这种情况最适合使用哪种技术?
这里是查询的形式
select c.shortname as Classname, //varchar type
// as "MainSchoolLevel"
count(s.studentid) as "No.ofStudents",
string_agg(distinct cast(l.shorttext as varchar(4)), ', ') as "SchoolLevels",
sum(case when s.specialstudent true then 1 else 0 end) as "No.ofSpecialStudents",
sum(case when s.handicappedstudent true then 1 else 0 end) as "No.ofhandicappedStudents",
from student s
join studentclass sc on sc.studentid = sc.id
join class c on c.id = sc.classid
join classlevel cl on cl.classid = c.id
join level on l.id = cl.levelid
尝试通过正则表达式提取值并将它们分配给新列
select
class,
(coalesce (substring (class, '^\d+'), '') as num_class,
(coalesce (substring (class, '[A-Za-z]+'), '') as str_class,
from student s ....