MySQL - объединение полей с добавленным полем - PullRequest
0 голосов
/ 28 июня 2018

Простой действительно - или должен быть.

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

Я предполагаю, что это concat-функция, но я не знаю, как добавить объединенные значения в поле в той же строке с существующим значением.

Есть ли оператор MySQL, который справится с этой задачей, или мне придется запустить зацикленный php-скрипт?

Пример ...

ID | NAME | POSITION | NOTES
1 | Richard | Programmer | Not paid enough
2 | David | Manager | Lazy
3 | Hilary | Personnel Manager | Doesn't care

В конечном счете, я хочу удалить поля NAME и POSITION, но я хочу сохранить эти значения заранее, поэтому я хочу объединить "-" .NAME. "-" .POSITION и добавить его в NOTES без потери каких-либо данных из этого поля. так что результат будет ...

ID | NAME | POSITION | NOTES
1 | Richard | Programmer | Not paid enough - Richard - Programmer
2 | David | Manager | Lazy - David - Manager
3 | Hilary | Personnel Manager | Doesn't care - Hilary - Personnel Manager

Имеет ли это смысл?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018
drop table if exists t;
create table t(ID int, NAME varchar(20), POSition varchar(20),NOTES varchar(500));
insert into t values
(1 , 'Richard' , 'Programmer' ,      'Not paid enough'),
(2 , 'David'   , 'Manager'    ,      'Lazy'),
(3 , 'Hilary'  , 'Personnel Manager','Doesnt care');

update t
set notes =
    CONCAT(NOTES, ' - ', NAME, ' - ', POSITION) 
where 1 = 1;

select * from t;

+------+---------+-------------------+------------------------------------------+
| ID   | NAME    | POSition          | NOTES                                    |
+------+---------+-------------------+------------------------------------------+
|    1 | Richard | Programmer        | Not paid enough - Richard - Programmer   |
|    2 | David   | Manager           | Lazy - David - Manager                   |
|    3 | Hilary  | Personnel Manager | Doesnt care - Hilary - Personnel Manager |
+------+---------+-------------------+------------------------------------------+
3 rows in set (0.00 sec)

В конечном счете, я хочу удалить поля ИМЯ и ПОЛОЖЕНИЕ Вы уверены, что хотите это сделать? выпустить кусочки снова - это боль.

Если какой-либо из элементов имеет значение null, concat вернет значение null, если элемент не имеет значения, тогда необходим тест ifnull

    update t
    set notes =
        CONCAT(IFNULL(NOTES,''), ' - ', IFNULL(NAME,''), ' - ', IFNULL(POSITION,'')) 
    where 1 = 1;

drop table if exists t;
create table t(ID int, NAME varchar(20), POSition varchar(20),NOTES varchar(500));
insert into t values
(1 , 'Richard' , 'Programmer' ,      'Not paid enough'),
(2 , 'David'   , 'Manager'    ,      'Lazy'),
(3 , 'Hilary'  , 'Personnel Manager','Doesnt care'),
(4 , 'HILARY'  , NULL,'DOES NOW') ;

update t
set notes =
    CONCAT(IFNULL(NOTES,''), ' - ', IFNULL(NAME,''), ' - ', IFNULL(POSITION,'')) 
where 1 = 1;

+------+---------+-------------------+------------------------------------------+
| ID   | NAME    | POSition          | NOTES                                    |
+------+---------+-------------------+------------------------------------------+
|    1 | Richard | Programmer        | Not paid enough - Richard - Programmer   |
|    2 | David   | Manager           | Lazy - David - Manager                   |
|    3 | Hilary  | Personnel Manager | Doesnt care - Hilary - Personnel Manager |
|    4 | HILARY  | NULL              | DOES NOW - HILARY -                      |
+------+---------+-------------------+------------------------------------------+
4 rows in set (0.00 sec)
0 голосов
/ 28 июня 2018

Функция CONCAT может легко справиться с этим в MySQL:

SELECT
    ID,
    NAME,
    POSITION,
    CONCAT(NOTES, ' - ', NAME, ' - ', POSITION) AS NOTES
FROM yourTable;
...