2009-12-07 731 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語句中的子選擇。

工作過。