依旧是上面的公共信息表info。有一个公共信息的操作页面,用户往这个表新增记录的时候,需要判断,已添加过的产品不能再次添加。
-
注意:用户新增信息的时候,产品是多选的,产品id以逗号分隔的形式提交字符串,如下:
-
提交参数:“11,13,20”,20在第二条记录中已经出现了,所以就不能添加
问题:两个以逗号分隔字符串(pro_ids字段 和 提交的字符串)如何匹配
思路:把提交的字符串参数,转换成表的形式,就和场景1一样了
select
t1.COLUMN_VALUE as id
from info t,TABLE(fn_split(#{ids},',')) t1
where instr(','|| t.pro_ids || ',',','|| t1.COLUMN_VALUE || ',')>0
创建 记录表 数据结构:
CREATE OR REPLACE TYPE "TY_STR_SPLIT" IS TABLE OF VARCHAR2 (8000)
自定义 分隔字符串 函数:
CREATE OR REPLACE FUNCTION fn_split
p_str IN VARCHAR2,
p_delimiter IN VARCHAR2 DEFAULT ','
) RETURN ty_str_split IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2(32767);
str_split ty_str_split := ty_str_split();
BEGIN
len := length(p_str);
len1 := length(p_delimiter);
WHILE j < len LOOP
j := instr(p_str, p_delimiter, i);
IF j = 0 THEN
j := len;
str := substr(p_str, i);
str_split.extend;
str_split(str_split.count) := str;
IF i >= len THEN
EXIT;
END IF;
str := substr(p_str, i, j - i);
i := j + len1;
str_split.extend;
str_split(str_split.count) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
- 之所以使用前后加上逗号的方式匹配判断,是因为怕出现如下情况:
- pro_ids = ”12,14“,COLUMN_VALUE=”1“,这样COLUMN_VALU就出现在pro_ids中了,但我们的期望是,只有12和14才能匹配上,改成如下:
- pro_ids = “,12,14,”,COLUMN_VALUE=“,1,”,这样COLUMN_VALU就不存在pro_ids中了
FIND_IN_SET(str,strlist),该函数用于判断 str 是否在 strlist 中,如果是,作为条件,返回对应数据,如果str不在strlist 或strlist 为空字符串,则返回值为 0 。
group_concat(),官方:该函数返回带有来自一个组的连接的非...
今天在写一个业务的时候, 遇到了一个慢查询。
我习惯写业务之前先将sql写好, 这样可以确保写业务之前数据源是对的,并且可以先看到自己写的sql慢不慢,有没有可以优化的地方。 今天在写sql时就遇到了一条很慢的sql.
我最开始写的sql是这样的:
-- 总共1517条结果
SELECT
count(*)
FROM DZShare.T_C_HISDATA_1H H , DZShare.T_C_AI_D A , DZShare.T_Y_SBBHDEVICE_SI
一个表的外键是有多个值组成,并由逗号分隔,如何与其他表关联查询?问题的场景尝试办法一:简单查询尝试办法二:动态传值
问题的场景
在开发的过程中,博主遇到了一个问题。由于其他人建表的时候没有严格的遵守第一范式的设计模式,导致一个字段里含有多个值,并以逗号分隔,但是这个字段又作为外键要与其他表的主键进行关联。如下图。
这个表里的tenant_id就是外键,可以存在多个以逗号分隔。
tenant_id...
该文章是转载,用于记录一下。原文章出处在:https://blog.csdn.net/Knight_quan/article/details/51767827
有时为了数据库简洁,存放数据的时候,某一字段采用逗号隔开的形式进行存储。
一般情况这个字段都应该具有如下几个共性。
被分割的字段一定是有限而且数量较少的,我们不可能在一个字符串中存储无限多个字符
这个字段所属的表与这个...
FIND_IN_SET 的作用是:判断某一个数值是否在 这个字段里面,假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。一个字符串列表就是一个由一些被‘,'符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strlist 或strlis...
书籍和作者之间是一对多的关系,那么在建表的时候,可以通过建立书籍表、作者表、书籍作者关联表【表中每个字段里只填充一个值,如果是一本书,多个作者,则新增多行数据】来实现业务逻辑,而不是把这种一对多的关系建立成一对一。: str 要查询的字符串,strlist 需查询的字段,参数以”,”分隔,形式如t_book表中的author_uuid;存在的问题:不同于普通的多表关联查询,author_uuid字段中存放的是作者uuid的集合,各个作者uuid之间以逗号隔开,无法直接进行数据关联。
在Python中,字典是一系列键-值对。每一个键都与一个值相关联,键可以用来访问与之相关联的值。与键相关联的可以是数字、字符串、列表乃至字典。
键-值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而键-值对之间用逗号分隔。
字典是一个动态结构,可随时在其中添加键-值对。Pyhton不关心键-值对的添加顺序,而只关心键和值之间的关联关系。
要修改字典中的值,可依次指定字典名、用方括号括起来的键以及与该键相关联的新值。
alien_0 = {‘color’: ‘gr
mysql以逗号分隔数据去另一张表关联查询:
SELECT t.tname, b.* FROM w_topic t ,w_dwxxb b WHERE CONCAT(',',t.orgcode,',') LIKE CONCAT('%,',b.orgcode,',%')
t表中的 t.name数据是以逗号分隔,以concat 分隔t.name 去b表中关联查询对应的数据;如果分隔符是“、”,则只需要改成以下:
SELECT t.tname, b.* FROM w_topic t ,w_dwxxb b