2009-12-07 733 views
1

我正在尝试使用REPLACE替换逗号的空格。MySQL:使用REPLACE作为IN语句的一部分

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

不过,如果我尝试以此为IN语句的一部分,我只能得到返回的第一个匹配(即,1)

这里是我的整个查询:在记录GLREPFUNCJOB01

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); 

场detail_2包含'1 2 3 4 5 6 7 86 9'

如果任何人有一些有用的提示,我怎样才能得到逗号字符串,并可以在IN中使用它,我很想听听他们。

+0

>在记录字段detail_2 GLREPFUNCJOB01包含 '1 2 3 4 5 6 7 86 9' 所以IN语句给你1,2,3,4,5,6,7,86,9 和AA .category_id应该等于那个字符串? – Tom 2009-12-07 04:11:52

回答

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

不能使用替换的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 
0

感谢您的帮助,但我们结束了在glrepfuncjob01创建临时表出来的值,并且使用作为IN语句中的子选择。

工作过。