mysql - 其中子句 : Compact byte storage day of week

标签 mysql sql

在名为 WebEventsMySQL 表中,我有一个名为 AutoEventDays 的列。它存储如下值:

0010000
0111110

每个数字代表一周中的一天,从星期日开始。 0 表示“当天不发送邀请”,1 表示“当天发送邀请”。所以 0010000 表示“仅在星期二发送邀请”。 0111110 表示“发送邀请 M-F”。

构造 where 子句 的最有效方法是什么,以便如果 1 匹配 今天(由服务器时间确定),该行将被返回,否则不会。例如:

On Tuesdays, this record will be returned: 0010000 
On all non-Tuesdays this record will NOT be returned: 0010000 
On M-F this record will be returned: 0111110 
On weekends this record will NOT be returned: 0111110

重要提示:AutoEventDays 是一个普通的 char(7),不是数字或二进制。

我的想法一直让我走上丑陋、复杂和重复的 where 子句的道路……而且我知道堆栈上的某个人会有一个有效的方法。提前致谢。

最佳答案

您可以使用带下划线和下划线的 LIKE 来匹配字符串:

SELECT *
FROM WebEvents
WHERE
    (DAYNAME(CURDATE())='Sunday'    AND AutoEventDays LIKE '1______')
OR  (DAYNAME(CURDATE())='Monday'    AND AutoEventDays LIKE '_1_____')
OR  (DAYNAME(CURDATE())='Tuesday'   AND AutoEventDays LIKE '__1____')
OR  (DAYNAME(CURDATE())='Wednesday' AND AutoEventDays LIKE '___1___')
OR  (DAYNAME(CURDATE())='Thursday'  AND AutoEventDays LIKE '____1__')
OR  (DAYNAME(CURDATE())='Friday'    AND AutoEventDays LIKE '_____1_')
OR  (DAYNAME(CURDATE())='Saturday'  AND AutoEventDays LIKE '______1')

如果您创建一个带有几天掩码的七行查找表,则可以简化此方法:

CREATE TABLE DayMaskLookup (DayName VARCHAR(10), Mask CHAR(7))
INSERT INTO DayMaskLookup VALUES ('Sunday',    '1______')
INSERT INTO DayMaskLookup VALUES ('Monday',    '_1_____')
INSERT INTO DayMaskLookup VALUES ('Tuesday',   '__1____')
INSERT INTO DayMaskLookup VALUES ('Wednesday', '___1___')
INSERT INTO DayMaskLookup VALUES ('Thursday',  '____1__')
INSERT INTO DayMaskLookup VALUES ('Friday',    '_____1_')
INSERT INTO DayMaskLookup VALUES ('Saturday',  '______1')

现在您的查询将如下所示:

SELECT *
FROM WebEvents e
JOIN DayMaskLookup m ON e.AutoEventDays LIKE m.Mask
WHERE m.DayName = DAYNAME(CURDATE())

关于mysql - 其中子句 : Compact byte storage day of week,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46879654/

相关文章:

mysql - 无法添加外键约束,快把我逼疯了,求助:)

mysql - 将 mysql 脚本转换为 postgresql 脚本

sql - 将 .db 文件上传到 Azure SQL

sql - JPA 或数据库架构中的外键级联

mysql - 如何使用shell脚本获取mysql的增量备份

mysql - Xampp Mysql 和 Apache 不工作 - 如何备份数据库

mysql - 有什么方法可以将单引号内的 NULL 导入到 mySQL 中吗?

php - 使用 MySQL 和 PHP 进行特定模式搜索 - 应该怎么做?

SQL服务器: need to escape [?

sql - 解析逗号分隔的字符串以生成Where子句中的IN字符串列表