我有一个大的10gb大的mysql数据库。数据库中的一个表称为
clients
在该表中有一个名为
的列case
创建此客户端的日期将与此列中的数字混合。
以下是case
011706-0001
06部分意味着此客户端是在2006年创建的。我需要提取在2015年和2016年创建的所有客户端。所以我需要查询case
在破折号之前有15或16的任何内容
例如,000015-0000
或000016-0000
有没有办法只用mysql做到这一点?我的思考过程是我必须查询整个列然后使用php到preg_match()
我担心根据数据库的大小,这会导致问题。
答案 0 :(得分:4)
查找c
列值包含case
的行(字符0和6后跟短划线...
一种选择是使用LIKE比较运算符:
'06-'
百分号字符是LIKE比较中的通配符,它匹配任意数量的字符(零,一个或多个)。
MySQL需要为表中的每个行评估该条件。 MySQL无法利用索引范围扫描操作。
SELECT ...
FROM clients t
WHERE t.case LIKE '%06-%'
ORDER BY ...
对于包含三个字符 SELECT ...
FROM clients t
WHERE t.case LIKE '%15-%'
OR t.case LIKE '%16-%'
ORDER BY ...
或'15-'
的序列的任何值,这将评估为真。
如果'16-'
列中的值有更标准的格式,其中值总是以代表日期case
的六个字符开头,并且您只想匹配第5到第7个字符,那么可以使用匹配任何一个字符的下划线通配符(在LIKE比较中)例如...使用四个下划线
'mmddyy-nnnnn'
或者您可以使用 t.case LIKE '____16-%'
函数从SUBSTR
值中提取三个字符,并执行相等比较...
case
也可以使用 SUBSTR(t.case,5,3) = '15-'
SUBSTR(t.case,5,3) IN ('15-','16-')
比较代替REGEXP
比较。
就性能而言,所有上述方法都需要在表中的每一行进行,以评估比较条件。
如果该日期值作为单独的列存储,作为DATE数据类型,并且有一个索引作为前导列,则MySQL可以有效地使用范围扫描操作,对于这样的查询。
LIKE