MySQL:使用REPLACE作为IN语句的一部分

时间:2009-12-07 03:56:51

标签: sql mysql string replace

我正在尝试使用REPLACE替换逗号空格。

如果我尝试SELECT REPLACE('1 2 3 4 5 6 7 86 9','',',');然后我得到了我需要的字符串。

但是,如果我尝试将其作为IN语句的一部分,我只返回第一个匹配(即1)

以下是我的整个查询:

SELECT aa.category_id, 
       aa.yyyymm, 
       aa.cat_balance_ytd 
  FROM gl_view_cat_balances AS aa 
 WHERE aa.gl_id = '/JOB//9' 
   AND aa.fin_years_ago = 0 
 **AND aa.category_id IN (REPLACE((SELECT detail_2 
                                     FROM gl_options 
                                    WHERE option_id = 'GLREPFUNCJOB01'),' ', ', '))** 
   AND aa.yyyymm = (SELECT max(bb.yyyymm) 
                      FROM gl_rep_cat_bals as bb 
                     WHERE bb.gl_unique_id = aa.gl_unique_id 
                       AND bb.category_id = aa.category_id 
                       AND bb.yyyymm <= 200910); 

记录GLREPFUNCJOB01中的字段detail_2包含'1 2 3 4 5 6 7 86 9'

如果有人对如何将逗号添加到字符串中有一些有用的提示,并且可以在IN中使用它,我很乐意听到它们。

3 个答案:

答案 0 :(得分:2)

您不能使用REPLACE创建逗号分隔列表以在IN子句中使用。要按原样使用,您必须使用MySQL's Prepared Statements(实际上是动态SQL) - 首先创建逗号分隔列表,然后将其插入到构造为字符串的SQL查询中,然后再执行它。

SELECT a.category_id, 
       a.yyyymm, 
       a.cat_balance_ytd 
  FROM GL_VIEW_CAT_BALANCES a
  JOIN GL_OPTIONS o ON INSTR(o.detail2, a.category_id)
                   AND o.option_id = 'GLREPFUNCJOB01'
 JOIN (SELECT b.category_id,
              b.gl_unique_id,
              MAX(b.yyyymm) 'yyyymm'
         FROM GL_REPCAT_BALSs b 
        WHERE b.yyyymm <= 200910
     GROUP BY b.category_id, b.gl_unique_id) x ON x.category_id = a.category_id
                                              AND x.gl_unique_id = a.unique_id
                                              AND x.yyyymm = a.yyyymm
 WHERE a.gl_id = '/JOB//9' 
   AND a.fin_years_ago = 0

这是一个未经测试的,可能的非动态SQL替代方案,使用FIND_IN_SET

SELECT a.category_id, 
       a.yyyymm, 
       a.cat_balance_ytd 
  FROM GL_VIEW_CAT_BALANCES a
  JOIN (SELECT REPLACE(o.detail_2, ' ', ', ') 'detail2_csv'
          FROM GL_OPTIONS o
         WHERE o.option_id = 'GLREPFUNCJOB01') y ON FIND_IN_SET(a.category, y.detail2_csv) > 0
  JOIN (SELECT b.category_id,
               b.gl_unique_id,
               MAX(b.yyyymm) 'yyyymm'
          FROM GL_REPCAT_BALSs b 
         WHERE b.yyyymm <= 200910
      GROUP BY b.category_id, b.gl_unique_id) x ON x.category_id = a.category_id
                                               AND x.gl_unique_id = a.unique_id
                                               AND x.yyyymm = a.yyyymm
 WHERE a.gl_id = '/JOB//9' 
   AND a.fin_years_ago = 0

答案 1 :(得分:0)

天哪,我找不到任何错误。经过无效的桌面检查后,我创建了所需的最小模式,并且执行正常,尽管这些表是空的。也许你可以显示一些数据记录?

SELECT aa.category_id, aa.yyyymm, aa.cat_balance_ytd
FROM gl_view_cat_balances AS aa
WHERE aa.gl_id = '/JOB//9' AND
      aa.fin_years_ago = 0 AND
      aa.category_id IN (REPLACE((SELECT detail_2
                                   FROM gl_options
                                   WHERE option_id = 'GLREPFUNCJOB01'),' ', ', ')) AND
      aa.yyyymm = (SELECT max(bb.yyyymm)
                    FROM gl_rep_cat_bals as bb
                    WHERE bb.gl_unique_id = aa.gl_unique_id AND
                          bb.category_id = aa.category_id AND
                          bb.yyyymm <= 200910);

答案 2 :(得分:0)

感谢您的帮助,但我们最终使用glrepfuncjob01中的值创建了一个临时表,并将其用作IN语句中的子选择。

做了一个款待。