MySQL WHERE IN匹配字段多值查询失效问题解决方法
解决逗号分隔日期字段的查询问题
嘿,我懂你遇到的困扰了!你的region表中dates字段存的是带引号、逗号分隔的文本字符串,不是数据库原生的数组类型,所以直接用IN操作符肯定没法匹配到里面的单个日期——IN是用来处理集合/数组元素的,它没法自动解析字符串里的内容~
下面给你分数据库场景提供可行的修改方案:
1. 如果你用的是PostgreSQL
可以先把字符串转成数组(还要去掉多余的引号),再用ANY操作符匹配:
SELECT * FROM region WHERE '2018-01-02' = ANY(string_to_array(replace(region.dates, '"', ''), ', '));
或者用IN结合unnest函数展开数组:
SELECT * FROM region WHERE '2018-01-02' IN (SELECT unnest(string_to_array(replace(region.dates, '"', ''), ', ')));
这里的, 是你存储的日期分隔符(逗号加空格),要和实际数据格式保持一致哦。
2. 如果你用的是MySQL
可以用FIND_IN_SET函数,不过得先把字符串里的引号和空格清理掉,因为这个函数默认只认纯逗号分隔的内容:
SELECT * FROM region WHERE FIND_IN_SET('2018-01-02', REPLACE(REPLACE(dates, '"', ''), ' ', ''));
3. 通用(适合多数数据库)的LIKE匹配法
这个方法虽然繁琐,但不用依赖数据库特定函数,需要注意避免部分日期匹配的问题(比如避免把2018-01-020误判成匹配):
SELECT * FROM region WHERE dates LIKE '%"2018-01-02"%' AND ( dates LIKE '%"2018-01-02",%' OR dates LIKE '%, "2018-01-02"%' OR dates = '"2018-01-02"' );
额外建议(重要!)
长远来看,这种逗号分隔的存储方式并不符合数据库设计的范式,查询效率低还容易出问题。最好的做法是新建一张关联表(比如region_dates),字段包含region_id和date,把每个日期单独存成一行数据,这样后续的查询、维护都会更方便高效~
内容的提问来源于stack exchange,提问作者ridwan skaterocks
相关产品推荐
相关产品推荐

