SQL查询,以逗号分隔字段

时间:2020-09-25 17:53:59

标签: mysql sql split

我有一个学生桌,看起来像这样:

 id  |  name  |  school_descriptors
-------------------------------------------------------
 1   |  Rob   |  Comp Sci,Undergraduate,2020  
 2   |  Tim   |  Business,MBA,2022
 3   |  Matt  |  Business,MBA,2022
 4   |  Jack  |  Law,Masters,2024
 5   |  Steph |  Comp Sci,Masters,2022  

school_descriptors字段仅是一列,并且以逗号分隔的字符串存储有关课程,资格和毕业年份的信息。 (它的设计非常糟糕,我希望可以将其拆分为自己的字段,但现在不能(我不是数据库所有者))

我想提供一个界面,教师可以在其中快速找到与某些课程,学历和毕业年份相匹配的学生,从而想创建相关的查询。

问题1:例如,我希望老师可以从用户界面中选择“业务”,“ MBA”,并返回ID为2和3的返回学生。我有一个示例问题:找到正在学习商务课程并获得MBA资格的学生:

SELECT * FROM student_table WHERE school_descriptors LIKE '%Business%' AND school_descriptors LIKE '%MBA%'

我想到的查询是一个基本的LIKE查询,但我不禁想到有一个更有效的查询,可以利用以下事实:school_descriptor字符串始终为1)(始终按特定顺序排列)课程,资格,毕业)和2)以逗号分隔,因此可能会分开。该表目前位于约5000行,因此相对较小,但预计会增长。

相关问题2 查找参加Comp Sci课程并在2019年毕业的学生:

是否可以拆分school_descriptors字段并添加一个>2019操作数?

非常感谢!

3 个答案:

答案 0 :(得分:1)

select id, name, 
  substring_index(school_descriptors,',',1) as course, 
  substring_index(substring(school_descriptors,length(substring_index(school_descriptors,',',1))+2,200),',',1) as Qualifications, 
  substring_index(school_descriptors,',',-1) as year
from student;

输出:

+------+-------+----------+----------------+------+
| id   | name  | course   | Qualifications | year |
+------+-------+----------+----------------+------+
|    1 | Rob   | Comp Sci | Undergraduate  | 2020 |
|    2 | Tim   | Business | MBA            | 2022 |
|    3 | Matt  | Business | MBA            | 2022 |
|    4 | Jack  | Law      | Masters        | 2024 |
|    5 | Steph | Comp Sci | Masters        | 2022 |
+------+-------+----------+----------------+------+

指向文档的链接,以防您想了解SUBSTRING_INDEX()

答案 1 :(得分:1)

在MySql中,您可以使用函数SUBSTRING_INDEX()拆分列school_descriptors
仅在课程,资格和毕业年份的职位固定的情况下才有效。

select *,
  substring_index(school_descriptors, ',', 1) Course, 
  substring_index(substring_index(school_descriptors, ',', 2), ',', -1) Qualification, 
  substring_index(school_descriptors, ',', -1) Graduation
from student_table 

请参见demo
结果:

> id | name  | school_descriptors          | Course   | Qualification | Graduation
> -: | :---- | :-------------------------- | :------- | :------------ | :---------
>  1 | Rob   | Comp Sci,Undergraduate,2020 | Comp Sci | Undergraduate | 2020      
>  2 | Tim   | Business,MBA,2022           | Business | MBA           | 2022      
>  3 | Matt  | Business,MBA,2022           | Business | MBA           | 2022      
>  4 | Jack  | Law,Masters,2024            | Law      | Masters       | 2024      
>  5 | Steph | Comp Sci,Masters,2022       | Comp Sci | Masters       | 2022    

答案 2 :(得分:1)

答案1:

SELECT * FROM student_table WHERE school_descriptors REGEXP ['Business','MBA']

使用此查询,您可以获得具有商务或MBA的所有记录。 如果您只想选择商业,MBA ,则可以尝试这样

选择*来自学生表,在“学校”描述符中,类似于“%Business,MBA%”

答案2:

SELECT * 
FROM student 
WHERE
  SUBSTRING_INDEX(SUBSTRING_INDEX(school_descriptors , ',', 1), ',', -1)='Comp Sci' 
  AND
  SUBSTRING_INDEX(SUBSTRING_INDEX(school_descriptors , ',', 3), ',', -1)> 2019;