Postgresql检查字符串是否包含许多字母

时间:2015-08-18 18:08:04

标签: sql postgresql

所以现在我在我的学校课程表中有一个名为days的列,其中包含特定部分将要运行的日期,例如' TR'将是它在周二和周四运行,并且' MWF'它将在周一,周三和周五运行。

我希望用户能够在运行的几天内过滤,所以如果一个类运行3次, MT,MW,TF我希望用户能够输入MTW,并获得第一个2.但是我能弄清楚如何正确查询它的唯一方法是将输入字符串变为所有可能性的数组,以便MTW会变成M,T,W,MT,MW,TW,MWT,看看天数是否在那个阵列中。它有效,但我想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:3)

我建议创建另一个表class_days,其中包含每天运行的一个表。

因此MWT中存储的days将在另一个表中存储为3行

class_days
class_id, day
1,M
1,W
1,T

然后,您可以使用not exists选择的课程,这些课程在未由用户提供的日期安排课程(因此所有课程都在指定日期安排)

select c.id from classes c
where not exists (
  select 1 from class_days cd
  where cd.class_id = c.id
  and cd.day not in ('M','W','T')
)

上面的查询假设classes中的每一行在class_days中至少有一行对应的行。如果不是这样,那么添加exists条件以确保您没有返回没有任何日期设置的类。

select c.id from classes c
where not exists (
  select 1 from class_days cd
  where cd.class_id = c.id
  and cd.day not in ('M','W','T')
) and exists (
  select 1 from class_days cd
  where cd.class_id = c.id
)

这些查询可以利用class_days(class_id,day)

上的综合索引

答案 1 :(得分:0)

你需要三张桌子

  • 班级
    ClassID 主键

  • 天 DayID 主键

  • ClassDay
    ClassID Foreing Key
    DayID Foreing Key

<强>更新

或者您可以使用按位运算符

让我们说星期一= 1,星期二= 2,星期日= 4,星期四= 8,星期五= 16

如果用户想要MTW。

您更新了课程

UPDATE Class
SET DAY = 1 + 2 + 4

并搜索

SELECT *
FROM Class 
WHERE 
     DAY & 1 
AND  DAY & 2
ADN  DAY & 4