【问题标题】:MySQL - Concatenating Fields to Appended FieldMySQL - 将字段连接到附加字段
【发布时间】:2018-12-07 10:45:22
【问题描述】:

简单的一个真的 - 或者应该是。

我有多个字段要压缩并附加到一个长文本字段。

我猜这是一个 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

这有意义吗?

【问题讨论】:

  • CONCAT 函数应该可以做到这一点:dev.mysql.com/doc/refman/8.0/en/…
  • 您能否通过将示例数据和预期结果作为文本添加到问题中来说明您的问题。
  • @TimBiegeleisen 谢谢。我知道如何连接,但不幸的是,这本身并没有给我整个解决方案。
  • @P.Salmon 我现在添加了一个应该更清晰的示例。

标签: mysql append concat


【解决方案1】:

CONCAT 函数可以在 MySQL 中轻松处理:

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

【讨论】:

  • 谢谢,但这只是一个连接选择功能。它不会附加任何我请求的关键部分。
  • @RichardOwens 然后可能会根据 PSalmon 的建议进行更新。我投票反对保留新列,因为它会重复信息。
  • 我知道它会创建重复项,但我想在它们全部连接后删除这些字段。 @PSalmon 解决方案正是我正在寻找的解决方案,但再次感谢您的意见。
【解决方案2】:
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 字段你确定要这样做吗?再次取出碎片是一种痛苦。

如果任何元素为空,如果不能保证元素有值,则 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)

【讨论】:

  • 有趣的是,这似乎在所有字段都不为 NULL 的情况下孤立地工作。如果 Foo 或 Bar 为 NULL,则 NOTES 不会更新为 Foo 或 Bar!我在 3 个连接的字段上应用这个,通常至少有一个为 NULL,它不返回任何更新。而且,是的,我确定我想这样做——也许使用一个独特的分隔符,以防我需要爆炸作为备份。
  • 更正,它刚刚使用空值更新了整个数据库的注释字段 - 有效地删除了所有记录注释...糟糕!!
猜你喜欢
  • 2012-10-05
  • 1970-01-01
  • 2011-01-21
  • 2018-09-16
  • 2016-05-11
  • 2020-12-03
  • 2016-07-20
  • 2020-11-07
  • 2012-01-05
相关资源
最近更新 更多