MySQL: использование REPLACE как части оператора IN - PullRequest
1 голос
/ 07 декабря 2009

Я пытаюсь использовать 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); 

Поле detail_2 в записи GLREPFUNCJOB01 содержит '1 2 3 4 5 6 7 86 9'

Если у кого-нибудь есть полезные советы о том, как я могу ввести запятые в строку и использовать их в IN, я бы хотел услышать о них.

Ответы [ 3 ]

2 голосов
/ 07 декабря 2009

Нельзя использовать REPLACE для создания списка с разделителями-запятыми для использования в предложении IN. Чтобы использовать все как есть, вам нужно будет использовать Подготовленные операторы MySQL (фактически динамический 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 голосов
/ 07 декабря 2009

Спасибо за вашу помощь, но мы закончили тем, что создали временную таблицу из значений в glrepfuncjob01 и использовали ее как вспомогательный выбор в операторе IN.

работал лакомством.

0 голосов
/ 07 декабря 2009

Черт возьми, я не могу найти ничего плохого. После бесполезной проверки я создал минимально необходимую схему, и она работает нормально, хотя таблицы пусты. Может быть, вы могли бы показать несколько записей данных?

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...