如何在不产生错误的情况下从 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 ....