MySQL - объединение полей с добавленным полем

0

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

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

Я предполагаю, что это функция 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 "и добавить его к ПРИМЕЧАНИЯм без потери данных из этого поля, чтобы результат было бы...

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

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

  • 0
    Функция CONCAT должна быть в состоянии сделать это: dev.mysql.com/doc/refman/8.0/en/…
  • 0
    Можете ли вы проиллюстрировать свою проблему, добавив примеры данных и ожидаемый результат в виде текста к вопросу.
Показать ещё 2 комментария
Теги:
append
concat

2 ответа

0
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)

В конечном счете, я хочу удалить поля NAME и POSITION, вы уверены, что хотите это сделать? получение бит снова является болью.

Если какой-либо из элементов является 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
    Интересно, что это кажется изолированным, когда все поля не равны NULL. Если Foo или Bar имеют значение NULL, NOTES не обновляется ни с Foo, ни с Bar! Я применяю это к 3 объединенным полям, и обычно используется хотя бы одно значение NULL, которое не возвращает никаких обновлений. И, да, я уверен, что хочу сделать это - возможно, используя уникальный разделитель на случай, если мне понадобится взорвать в качестве резервной копии.
  • 0
    ИСПРАВЛЕНИЕ, ЭТО ПРОСТО ОБНОВИЛ ПОЛЕЗНЫЕ НОТЫ ДЛЯ ВСЕЙ БАЗЫ ДАННЫХ С НУЛЕВЫМ ЗНАЧЕНИЕМ - ЭФФЕКТИВНО УДАЛЯ ВСЕ ЗАПИСИ ЗАПИСЕЙ ... ОЙ !!
0

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

SELECT
    ID,
    NAME,
    POSITION,
    CONCAT(NOTES, ' - ', NAME, ' - ', POSITION) AS NOTES
FROM yourTable;
  • 0
    Спасибо, но опять же, это просто функция выбора concat. Он не добавляет ничего, что является важной частью моего запроса.
  • 0
    @RichardOwens Тогда, возможно, сделайте обновление как PSalmon Suggets. Я голосую против сохранения новой колонки, поскольку она дублирует информацию.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню