SQL查询之字段是逗号分隔开的数组如何查询匹配数据问题

目录
  • 字段是逗号分隔开的数组如何查询匹配数据
    • 方式一:CHARINDEX***()*****
    • 方式二:WHERE LIKE
  • Mysql逗号分隔的字段查询
    • 1.like
    • 2.find_in_set
    • 3.regexp
  • 总结

字段是逗号分隔开的数组如何查询匹配数据

方式一: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,(^|,)表示数字前面必须是字符串开头或者是一个逗号,(,|$)表示数字后面必须是逗号或者字符串的结尾。这样就可以完整匹配逗号分隔的元素了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • sql查询一个数组中是否包含某个内容find_in_set问题

    目录 sql查询数组中是否包含某个内容find_in_set sql判断字段值中是否包含某个字符串 总结 sql查询数组中是否包含某个内容find_in_set 如果表Atable中的a字段内容是1,2,3 的格式(a字段是用,分隔的),要查询该字段是否包含1则可以用find_in_set 例: id a 1 1,2,3 2 1111,11 SELECT * FROM Atable WHERE find_in_set(1,a) 结果 id a 1 1,2,3 sql判断字段值中是否包含某个字符串

  • 将string数组转化为sql的in条件用sql查询

    例如:我想将String[] str = {"4","5","6"}转化为"'4','5','6'"字符串.这样我就可以用sql查询:select * from tableName id in (字符串)了. 项目中实现的源码如下: 复制代码 代码如下: StringBuffer idsStr = new StringBuffer(); for (int i = 0; i < ids.length; i++) { if

  • mysql根据json字段内容作为查询条件(包括json数组)检索数据

    最近用到了mysql5.7的json字段的检索查询,发现挺好用的,记录一下笔记我们有一个日志表,里面的data字段是保存不同对象的json数据,遇到想根据里面的json的字段内容作为条件查询的情况 mysql根据json字段的内容检索查询数据 使用 字段->'$.json属性'进行查询条件 使用json_extract函数查询,json_extract(字段,"$.json属性") 根据json数组查询,用JSON_CONTAINS(字段,JSON_OBJECT('json属性'

  • SQL查询之字段是逗号分隔开的数组如何查询匹配数据问题

    目录 字段是逗号分隔开的数组如何查询匹配数据 方式一:CHARINDEX***()***** 方式二:WHERE LIKE Mysql逗号分隔的字段查询 1.like 2.find_in_set 3.regexp 总结 字段是逗号分隔开的数组如何查询匹配数据 方式一:CHARINDEX***()***** SELECT     *  FROM     U_PUR1  WHERE     CHARINDEX( ',' + '100306' + ',', ',' + DeptCode + ',' )

  • SQL Server查询某个字段在哪些表中存在

    一.查询SQL Server中所有的表 SQL语句: SELECT * FROM sys.tables name列表示所有的表名. 二.查询SQL Server中所有的列 SQL语句: SELECT * FROM sys.columns name列表示所有的字段名称. 两张表根据object_id进行关联 语法: select * from sys.tables tinner join sys.columns c on t.object_id=c.object and c.name='要查询的字

  • SQL实现查询某字段的值为空的记录

    目录 SQL查询某字段的值为空 SQL某字段为null 查询语句 SQL查询某字段的值为空 sql中字段的默认有NULL和另一种空白的形式 如何取查询这两种存在的记录呢? 空白值查询: SELECT * FROM Test WHERE Name = '' SELECT * FROM Test WHERE Name = "" NULL值查询: SELECT * FROM Test WHERE Name IS NULL 这两个语句查询出的结果是不一样的. SQL某字段为null 查询语句

  • sqlserver给表添加新字段、给表和字段添加备注、更新备注及查询备注(sql语句)

    先给大家介绍下sqlserver给表添加新字段.给表和字段添加备注.更新备注及查询备注,代码如下所示: -- 添加新字段及字段备注的语法 USE MY_SlaughterProduct--数据库 ALTER TABLE MY_SP_PackagingWeight--表名 ADD FSummary--字段名 int--类型 default ((0)) --默认值 go --给字段添加注释 EXEC sp_addextendedproperty N'MS_Description', N'是否称重汇总

  • MyBatis-Plus 查询指定字段的实现

    首先创建一个数据库表,如下图所示: 然后创建一个Spring Boot项目,pom.xml和配置如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schema

  • 基于postgresql查询某个字段属于哪个表的说明

    一.场景还原 前端小林问我,它从前端的返回的某些字段,想知道那个表有这个字段,它想操作这个表-- 二.sql语句 SELECT * FROM information_schema. COLUMNS WHERE COLUMN_NAME = 'storename'; SELECT c.relname AS "表名",a.attname AS "字段名",c.oid FROM pg_class c LEFT JOIN pg_attribute a ON a.attreli

  • spring data jpa 查询自定义字段,转换为自定义实体方式

    目标:查询数据库中的字段,然后转换成 JSON 格式的数据,返回前台. 环境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2 背景:首先建立 entity 映射数据库(非专业 java 不知道这怎么说) @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long

  • 基于JPA查询部分字段的相关事项

    JPA查询部分字段相关事项 JPA使用HQL查询部分字段出错 org.hibernate.hql.internal.ast.QuerySyntaxException: XXX is not mapped 解决 应该@Entity指定name名,name值为对应表名,同@Table的name值相同 使用HQL的注意 1.想要使用JPA查询部分信息,需要使用HQL 2.select需跟实体,可以是map(必须是小写,大写试了下报错),或者是将待查询的字段单独封装成一个实体,new 实体 3.查询的字

  • SpringBoot使用JPA实现查询部分字段

    目录 SpringBoot JPA查询部分字段 自定义简单的查询方法 SpringBoot JPA查询部分字段 用过JPA的都知道,只需要继承JpaRepository 根据Jpa的函数命名规范写出接口中的函数,不需要实现,底层就可以自动解析成各种数据库的sql语句,进行增删改查等操作. 自定义简单的查询方法 如findByUserName,findByUserNameOrEmail(String username, String email)等条件的属性名称与个数要与参数的位置与个数一一对应,

  • 关于查询MySQL字段注释的5种方法总结

    目录 前言 创建测试数据库 查询所有表注释 查询所有字段注释 字段注释查询方式1 字段注释查询方式2 字段注释查询方式3 字段注释查询方式4 字段注释查询方式5 修改表注释和字段注释 修改表注释 修改字段注释 总结 前言 很多场景下,我们需要查看 MySQL 中表注释,或者是某张表下所有字段的注释,所以本文就来盘点和对比一下查询注释的几种方式. 创建测试数据库 开始之前咱们先创建一个数据库,以备下面演示使用. -- 如果存在就先删除数据库 drop database if exists test

随机推荐