我正在尝试使用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中使用它,我很乐意听到它们。
答案 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语句中的子选择。
做了一个款待。