【杂谈】SQL 杂录: 如何模糊查询表里不存在的字段

SQL 杂录: 如何模糊查询表里不存在的字段

1. 前提&场景

前提
表与需求都合理且不能更改。因此接下来我们就要根据需求与表结构实现一个较为特殊的模糊查询。

场景
要根据某个字段进行模糊查询, 但是这个字段是由若干个字段复合组成的,该字段在表中分为若干个字段存储,显示的时候拼接成一个字段。由于若干个字段复合略显复杂,因此接下来我们以2个字段举例:

举例
例如,我们某个编号,由前缀 prefix与 自增数字 number组成。一般情况下,我们直接从表里查prefixnumber,然后再拼接显示即可。但是,当前特殊情况下,当number小于10时,为了对齐显示方便用户查看,需要在显示的时候在组合形成的字符串中补位补个"0",像这样:

prefixnumber
A1
B20

通过这个表查出来的结果若直接拼接,将会是:

prefixnumberresult
A1A1
B20B20

目标结果与实际显示应该是:

prefixnumberactual_result
A1A01
B20B20

实现这种显示,要么就要在查询的时候,直接查出来封装到VO中;要么就要分别查出让前端进行拼接。
毕竟,前提不能变嘛,表里没有冗余这两个字段拼接好的字段,无法直接模糊查询这个冗余字段。

那么问题来了,如何模糊查询这个可能随时在中间补位的字段呢?

2. 思路与解决方案

一般情况
一般情况下,我们直接查询,拼接即可。若后端封装的VO 存在该复合字段,则可以在查询的时候就用CONCAT函数查询,例如

SELECT 
*
FROM t1
WHERE CONCAT( prefix, number ) LIKE CONCAT('%', '0', '%')

这是一般中间没有补位的情况下这样查是比较方便的方式。

思路
一般遇到复合字段,两种思路:

  1. 先查后拼接:不增加额外开销,直接查询,查询完毕后,再交给前端拼接。这种方式对后端相对简单,对前端也提供了相对较大的样式调整灵活性。
  2. 查询时就拼接:通过聚合函数等方式,牺牲一点点 SQL 资源,在查询的时候就做好拼接,并能直接匹配查询条件。这种方式实际操作下来,最符合当前条件与需求。
  3. 业务上对查询条件进行过滤。效率最低、最麻烦的方法,类似于算法中的全排列算法,不到业务复杂到只能通过这种方法解决的地步决不用这个方法。

最终解决方案
聚合函数,通过聚合函数在查询时就实现拼接、匹配模糊字段。
以我们上文列举的两个字段复合并可能存在补位的情况为例:

SELECT
	*,
	IF(number < 10, CONCAT( prefix,'0', number ), CONCAT( prefix, number ))  AS total 
FROM
	t1
WHERE
    IF(number < 10, CONCAT( prefix,'0', number ), CONCAT( prefix, number )) LIKE CONCAT( '%', '0', '%' )

这样就解决了模糊查询查询数据库表中原本不存在的字段值。

3. 小结

对于遇到类似问题的朋友来说,以上方案可供参考。除了上文提到的参考方案,我们还可以根据不同的业务使用不同的聚合函数,以实现更多稍微特殊的查询,例如,在我解决问题的过程中,我的导师@Kievn就提到使用LOCATE()函数对数字与字符串做进一步判断与处理,可适配更多的场景。

总的来说,方法总比困难多,只要需求合理,设计合理,我们就有办法实现,持续卷!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值