LOCATE
和FIND_IN_SET
函数无法按预期工作。如果它是0值,则每个函数的结果应为1。
VALUES
concat(',',t_insercion.fkCno2011,',')
值 ,305,
v_curso_cnos.cnos
值 ,,305,606,
功能
locate(v_curso_cnos.cnos, concat(',',t_insercion.fkCno2011,','))
find_in_set(concat(',',t_insercion.fkCno2011,','), v_curso_cnos.cnos)
查询是:
SELECT r_cursoalumno.fkCurso AS idCurso,
r_cursoalumno.fkPersona AS persona,
v_curso_cnos.cnos,
concat(',',t_insercion.fkCno2011,',') as idCno,
locate(v_curso_cnos.cnos, concat(',',t_insercion.fkCno2011,',')) as cmp1,
find_in_set(concat(',',t_insercion.fkCno2011,','), v_curso_cnos.cnos) as cmp2
FROM v_curso_cnos
INNER JOIN (r_cursoalumno
LEFT JOIN t_insercion ON r_cursoalumno.fkPersona = t_insercion.fkPersona)
ON v_curso_cnos.id = r_cursoalumno.fkCurso
WHERE r_cursoalumno.fkPersona = 20386
查询结果为此,但 locate 和 find_in_set 应返回非零值。为什么不呢?
idCurso persona cnos idCno cmp1 cmp2
____________________________________________________
453 20386 ,,305,608, ,305, 0 0
答案 0 :(得分:0)
我认为您希望在调用LOCATE时切换参数的顺序。
根据您的输出,v_curso_cnos.cnos
会返回,,305,608,
,而concat(',',t_insercion.fkCno2011,',')
会返回,305,
。
LOCATE
函数尝试在第二个字符串中查找第一个字符串的出现位置。在您的情况下,您试图在,,305,608,
中找到,305,
。
FIND_IN_SET
搜索以逗号分隔的字符串列表中出现的第一个字符串。这意味着它假设所有','都是分隔符,而不是字符串的一部分。在您的情况下,您试图在,305,
中找到,,305,608,
,但该函数会将您的第二个字符串解释为包含五个字符串的列表,''
,''
,{{1 }},'305'
和'608'
;其中没有一个包含''
。此外,文档还说明了以下内容:
如果第一个参数包含a,则此函数无法正常工作 逗号(“,”)字符。