1.1concat,concat_ws,group_concat
配置方式
临时:SET SESSION group_concat_max_len = 10240;
永久:配置文件my.ini增加group_concat_max_len=10240
查看配置:show variables like 'group_concat_max_len';
2.1oracle-start with
mysql没有start with操作,需要自己封装函数
参考
drop function if exists get_child_list_virtual_house;
create function get_child_list_virtual_house(in_id varchar(10)) returns TEXT
begin
declare ids TEXT default '';
declare tempids TEXT;
set tempids = in_id;
while tempids is not null do
set ids = CONCAT_WS(',', ids, tempids);
select GROUP_CONCAT(id) into tempids from T_VIRTUAL_HOUSE where FIND_IN_SET(pid, tempids)>0;
end while;
return ids;
end;
注意:
1.mysql的函数不允许动态sql,因此无法使用入参作为表名,只能把表名称写死
2.返回值ids,中间量tempids的类型要尽可能的大一些,否则可能超长报错
SQL 错误 [1406] [22001]: Data truncation: Data too long for column 'tempids' at row 1
3.group_concat()存在长度限制,默认1024,如果不修改的话,可能导致结果数据缺失
设置方式 SET SESSION group_concat_max_len = 6000;
这种设置在mysql重启后失效,永久生效需要到配置文件增加配置
group_concat_max_len = 102400
查看当前设置的长度
show variables like 'group_concat_max_len';
结论:显然,我们应当尽量避免这样的操作,如果是mysql8以上的版本,可以使用WITH RECURSIVE来实现树形查询,当然也可以根据业务需求的其他字段曲线救国,比如通过树形关系存储表的fullname,fullpath这种类似的字段模糊搜索来实现查询所有子节点的操作
3.1模糊查询,查询语句中的拼接
mysql
like '%'#{keyName}'%'
oracle
like '%'||#{keyName}||'%'