【Sql】把数据库字段用函数根据逗号分裂成列表,然后判断列表中是否包含目标值
- 【1】问题描述
- 【2】Oracle内置函数解决
- 【3】mysql的内置函数INSTR()
- 【4】mysql的内置函数FIND_IN_SET()
【1】问题描述
数据库中【库信息db】和【集群信息cluster】是一对多的关系,但是没有将集群信息存成多条,而是把集群名称和集群地址通过逗号拼接,然后存到一个字段里
现在需要根据集群名称,判断某个集群是否已经和库名SCHEMA_NM绑定了,因为CLUSTER_NM是拼接的字段,所以可以考虑模糊查询like,但是模糊查询匹配的不准确,我们想要确保完整准确的查询到集群名对应的记录
【2】Oracle内置函数解决
可以使用Oracle的内置函数来实现将数据库字段根据逗号分裂成列表,并判断列表中是否包含目标值。以下是一个示例查询:
SELECT*
FROM( SELECT CLUSTER_NM, SCHEMA_NM FROM DB_X_CLUSTER WHERE INSTR( ',' || CLUSTER_NM || ',', ',模型集群111,' ) > 0 ) dxcLEFT JOIN PROJ_X_DB pxd ON pxd.SCHEMA_NM = dxc.SCHEMA_NMLEFT JOIN PROJ_INFO pi ON pxd.PROJ_ID = pi.id
WHEREpi.PROJ_STAT = 0
主要注意的是这一段
SELECT CLUSTER_NM, SCHEMA_NM FROM DB_X_CLUSTER WHERE INSTR( ',' || CLUSTER_NM || ',', ',模型集群111,' ) > 0
(1)‘,’ || CLUSTER_NM || ‘,’:表示给数据库里的字段前后都加上逗号,原来的值也就变成了【,大数据平台集群111,模型集群111,】,这样就方便匹配
(2)‘,模型集群111,’:给要查的目标值的前后也加上逗号
(3)INSTR,判断字符串中是否包含目标值
【3】mysql的内置函数INSTR()
有时,您想要在字符串中查找子字符串或检查字符串中是否存在子字符串。在这种情况下,您可以使用字符串内置INSTR()函数。
INSTR()函数返回字符串中子字符串第一次出现的位置。如果在str中找不到子字符串,则INSTR()函数返回零(0)。
INSTR(str,substr);
str是要搜索的字符串。
substr是要搜索的子字符串。
【4】mysql的内置函数FIND_IN_SET()
可以使用MySQL的内置函数FIND_IN_SET()来实现这个需求。FIND_IN_SET()函数可以在一个由逗号分隔的字符串中查找一个值,如果找到,则返回其索引位置。
下面是一个示例查询,展示了如何将字段按逗号分割成列表,并判断列表中是否包含目标值:
SELECT *
FROM your_table
WHERE FIND_IN_SET('目标值', REPLACE(your_column, ' ', '')) > 0;
在上述查询中,您需要将your_table替换为您的表名,your_column替换为您要进行匹配的字段名,'目标值’替换为您要匹配的值。
请注意,使用REPLACE()函数将字段中的空格去除是为了避免空格干扰匹配。