2016-02-02 2 views
0

У меня есть две таблицы базы данных, в одном из них у меня есть несколько сообщений (например, шаблон), а во втором - значения, которые необходимо заменить в сообщении.Замена значений из одного столбца значениями из другого

Я попытаюсь объяснить себя

В таблице AI есть что-то вроде этого

Id - сообщение

1 - "Пользователь {0} входа в систему из {1}"

В таблице BI есть что-то вроде этого

Id - Идентификатор сообщения - ParamValue - ParamPosition

1 - 1 - Hugo - 0

2 - 1 - Компьютер A - 1

То, что я хотел бы иметь это сообщение формируется как

пользователя Хьюго входа в систему с компьютера

Что-то вроде string.format в C#.

Как это сделать и как я могу это сделать независимо от того, сколько параметров есть ли сообщение?

Благодарим за помощь!

+0

Я не думаю, что вы можете сделать это с помощью запроса в MySQL. Вы можете сделать это с помощью хранимой процедуры, используя 'while'. –

+0

См. Http://stackoverflow.com/questions/1262786/mysql-update-query-based-on-select-query для решения –

ответ

0

Как @Gordon Linoff указал в комментариях, что MySQL не подходит для таких задач. Однако, если ваша таблица сообщений несколько «константа» вы могли бы попытаться заменить значения, как это:

SELECT 
    REPLACE(REPLACE(messages.message, '{0}', first_param.ParamValue), 
    '{1}', second_param.ParamValue) 
FROM 
    messages LEFT JOIN params first_param ON (first_param.message_id = messages.id) 
      LEFT JOIN params second_param ON (second_param.message_id = messages.id) 

Но остерегайтесь, что решение будет работать только для более чем двух параметров.

+0

Любая идея о том, как это сделать, если у меня есть параметры «x»? Некоторые сообщения могут иметь только один, а другие могут иметь более одного. Я думал, может быть, проверить каждый символ в сообщении и посмотреть, если это число, если это я буду искать соответствующее значение ... но я не думаю, что это хороший способ –

0

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

;WITH CTE 
AS 
(
    select Msgid,[0] as position0,[1] as position1 
    from 
    (
     SELECT Msgid,paramvalue,position 
     FROM #tableB 
    )pv 
    pivot 
    (
     max(paramvalue) FOR position IN ([0],[1]) 
    )P 

) 

SELECT 
    REPLACE(REPLACE(om.Msg, '{0}', pm.position0),'{1}', pm.position1) 
from #tableA om 
left join CTE pm ON om.id = pm.Msgid