我的表中有一个名为student_id
的列,我存储与该列中特定记录关联的学生ID,并以|
字符分隔。以下是该列中数据的几个示例条目:
243|244|245
245|1013|289|1012
549|1097|1098|245|1099
我需要编写一个SQL查询,它将返回student_id
为245的记录。任何帮助将不胜感激。
答案 0 :(得分:4)
不要在student_id
字段中存储多个值,因为每行只有一个值,并且列交集是First Normal Form的要求。出于多种原因,这是一件好事,但显而易见的是,它解决了必须处理student_id
“1245
”等案件的问题。
相反,最好有一个单独的表来存储与此表中的记录关联的学生ID。例如(您还希望为此表定义添加适当的约束),
CREATE TABLE mytable_student_id (
mytable_id INTEGER,
student_id INTEGER
);
然后你可以使用连接查询:
SELECT * FROM mytable JOIN mytable_student_id
ON (mytable.id=mytable_student_id.mytable_id) WHERE mytable_student_id.student_id = 245
请注意,由于您没有发布有关原始表的任何架构详细信息,除了它包含student_id
字段,因此出于此示例的目的,我将其称为mytable
(并假设它有一个名为id
的主键字段 - 主键是1NF的另一个要求。
答案 1 :(得分:0)
@Donut关于First Normal Form是完全正确的:如果你有一对多关系,你应该使用一个单独的表,其他解决方案会导致ad-hoccery和不可维护的代码。
但如果您面对的数据实际上是这样存储的,那么这样做的一种常用方法是:
WHERE CONCAT('|',student_id,'|') LIKE '%|245|%'
答案 2 :(得分:0)
同样,我同意Donut,但如果您暂时无法对数据做任何事情,这是正确的查询。
WHERE student_id like '%|245|%' or student_id like '%|245' or student_id like '245|%'
这将处理245位于字符串的开头,中间或末尾。但是,如果你没有坚持这个设计,请,请做Donut推荐的。