SQL查询之字段是逗号分隔开的数组如何查询匹配数据问题
作者:江城撅嘴的川羌 发布时间:2024-01-21 22:32:08
字段是逗号分隔开的数组如何查询匹配数据
方式一:CHARINDEX***()*****
SELECT
*
FROM
U_PUR1
WHERE
CHARINDEX( ',' + '100306' + ',', ',' + DeptCode + ',' ) >0
匹配字符串开始位置的函数 CHARINDEX(str1,str,[start])
CHARINDEX(str1,str,[start]) 函数返回子字符串 str1 在字符串 str 中的开始位置,start 为搜索的开始位置,如果指定 start 参数,则从指定位置开始搜索;如果不指定 start 参数或者指定为0或者负值,则从字符串开始位置搜索。
方式二:WHERE LIKE
SELECT
*
FROM
U_PUR1
WHERE
',' + DeptCode + ',' LIKE '%,' + '100306' + ',%';
Where Like 的方式显然更好理解一些,首先在字段收尾加上逗号,这样可以使得字段中每一个值都拥有完整的格式,再使用Like进行模糊匹配时,可以使首尾的值都能匹配到。
Mysql逗号分隔的字段查询
在工作中,经常会遇到一对多的关系,比如用户和爱好。想要在mysql中保存这种关系,一般有两种方式,一种是建立一张用户爱好表user_hobby(user_id, hobby_id),这样一条user_id就会存在多条记录。
或者采用第二种方式,直接在用户表中增加hobby_ids字段,将hobby_id拼接成用逗号分隔的字符串保存起来。
那么问题来了,如果采用第二种方式的话,查询的时候要如何处理呢?下面介绍几种常见的处理方式。
1.like
可能最新想到的是采用like的形式,如下:
select * from user where hobby_ids like '%1%';
这种方式是否可行呢? 行,但是有适用范围,如果hobby_id在10以内,那么这么处理完全是可以的,但是一旦超过了10,那'%1%'就会把10,11,这些带1的id全都匹配处理。
2.find_in_set
为了解决like存在的问题,还可以使用mysql提供的find_in_set(str, strlist),sql可以这样写:
select * from user where find_in_set('1', hobby_ids);
这样mysql就会把hobby_ids的值,按照逗号分隔的一个个元素去匹配。如果我们要匹配多个值要怎么办呢,比如查找喜欢1-篮球或2-足球的用户,可以
select * from user where find_in_set('1', hobby_ids) or find_in_set('2', hobby_ids);
如果匹配的值较多,我们可能要拼很长的sql,那有没有稍微简短的方式呢,我们可以采用下面的方式。
3.regexp
regexp是mysql提供的强大的正则匹配方式。上面的sql就可以改写成:
select * from user where hobby_ids regexp '(^|,)(1|2)(,|$)';
这里是完全采用字符串正则匹配的方式,(1|2)表示匹配1或者2,(^|,)表示数字前面必须是字符串开头或者是一个逗号,(,|$)表示数字后面必须是逗号或者字符串的结尾。这样就可以完整匹配逗号分隔的元素了。
来源:https://blog.csdn.net/m0_63969219/article/details/125903234


猜你喜欢
- 话说网站首页是用.NET语言写的,而二级栏目页却是用ASP写的,然后再配上众多全手工的静态专题页,整个网站形成了一个大杂烩。想要在这大杂烩中
- 前端Vue 8080端口,后端Node.js 8085端口 主要记录下前后端不同端口遇到的问题1、写服务器端程序,我的在(node_prox
- 前言我们可以给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面等等。我们通过给几个特定视图函数加装饰器实现了这个需求
- SQLServer中的批量注释批量注释Ctrl + (K,C):按住Ctrl键不放,然后依次按下K和C批量取消注释Ctrl + (K,U):
- 说明为水平排列的表单和内联表单设置可选的图标.示例<!DOCTYPE html><html lang="zh-C
- 一、概述及完整代码对MNIST(MixedNational Institute of Standard and Technology dat
- 引言:Python中的变量在使用中很流畅,可以不关注类型,任意赋值,对于开发来说效率得到了提升,但若不了解其中的机理,往往也会犯一些小错,让
- 本人非计算机,亦非心理学,或者交互设计,更非设计专业出身,因此什么都是半桶水。即使如此,依然靠着兴趣寻找乐趣。对于设计,爱之,但没有受过系统
- 在pycharm中的jupyter notebook上经常会出现端口被占用,ipython的port端口一般是8888如果打开了jupyte
- logging模块简介Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并
- 前言SPA项目中,首屏加载速度都是老生常谈的问题了,首屏时间直接反应了用户多久能看到页面的主要内容,这决定了用户体验,本文聊一聊如何采集首屏
- 将套接字流重定向到标准输入或输出流#!/usr/bin/env python3"""测试socket-stre
- 上一篇介绍了如何在 Oracle 生成随机数字、字符串、日期、验证码以及 UUID,今天我们继续讨论在 MySQL 中生成各种随机数据的方法
- Pycharm安装pywin32报错1、在pycharm的寻找并安装插件pywin32时报错大致意思是安装失败,建议的解决方案:尝试从系统终
- 创建表书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-
- Gogland 是 JetBrains 公司推出的Go语言集成开发环境。Gogland 同样基于 IntelliJ 平台开发,支持 JetB
- 关于eslint空格缩进等的报错问题解决办法有四种1. 在.eslintrc.js文件中添加如下代码:rules: { &nb
- 前言在浏览博客时,偶然看到了用python将汉字转为拼音的第三方包,但是在实现的过程中发现一些参数已经更新,现在将两种方法记录一下。xpin
- 原以为在IronPython中使用MySQL是一件很容易的事情,即使有麻烦,也可以改变路径,加载Python下的MySQL模块。事实证明,这
- 在/etc/profile.d/简历oracle.sh内容如下在NLS_LANG设置编码ORACLE_HOME=/usr/lib/oracl