查询无法找到以逗号分隔的子字符串作为表的字段

时间:2012-09-05 11:48:47

标签: mysql sql

LOCATEFIND_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

1 个答案:

答案 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,则此函数无法正常工作   逗号(“,”)字符。