Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何用SQL替换单个列中的多个值?_Mysql_Sql_Postgresql - Fatal编程技术网

Mysql 如何用SQL替换单个列中的多个值?

Mysql 如何用SQL替换单个列中的多个值?,mysql,sql,postgresql,Mysql,Sql,Postgresql,我有一个用户id复杂的列。我想替换select查询中的文本 这将为每个值创建一个新列,并由更新。我希望在一列中替换它们。我怎样才能做到这一点 select replace(updated_by, '5eaf5d368141560012161636', 'A'), replace(updated_by, '5e79d03e9abae00012ffdbb3', 'B'), replace(updated_by, '5e7b501e9abae00012ffdbd6', 'C

我有一个用户id复杂的列。我想替换select查询中的文本

这将为每个值创建一个新列,并由更新。我希望在一列中替换它们。我怎样才能做到这一点

select replace(updated_by, '5eaf5d368141560012161636', 'A'),
       replace(updated_by, '5e79d03e9abae00012ffdbb3', 'B'),
       replace(updated_by, '5e7b501e9abae00012ffdbd6', 'C'),
       replace(updated_by, '5e7b5b199abae00012ffdbde', 'D'),
       replace(updated_by, '5e7c817c9ca5540012ea6cba', 'E'),
       updated_by
from my_table
GROUP BY updated_by;

这个一定是嵌套的liek这个

SELECT 
    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(updated_by,
                        '5e7c817c9ca5540012ea6cba',
                        'E'),
                    '5e7b5b199abae00012ffdbde',
                    'D'),
                '5e7b501e9abae00012ffdbd6',
                'C'),
            '5e79d03e9abae00012ffdbb3',
            'B'),
        '5eaf5d368141560012161636',
        'A'),
    updated_by
FROM
    my_table
GROUP BY updated_by
这将替换所有发生的模式,如果它们不是因为什么都没有发生

用例:

在Postgres中,我将使用表达式来形成派生表:

只需选择:

SELECT *
FROM   my_table m
JOIN  (
   VALUES
     ('5eaf5d368141560012161636', 'A')
   , ('5e79d03e9abae00012ffdbb3', 'B')
   , ('5e7b501e9abae00012ffdbd6', 'C')
   , ('5e7b5b199abae00012ffdbde', 'D')
   , ('5e7c817c9ca5540012ea6cba', 'E')
   ) u(updated_by, new_value) USING (updated_by);
或左连接以包含行而不替换

您可能需要使用非默认数据类型的显式类型转换。见:

为了重复使用,请创建一个持久化的翻译表

CREATE TABLE updated_by_translation (updated_by text PRIMARY KEY, new_value text);

INSERT INTO my_table
VALUES
  ('5eaf5d368141560012161636', 'A')
, ('5e79d03e9abae00012ffdbb3', 'B')
, ('5e7b501e9abae00012ffdbd6', 'C')
, ('5e7b5b199abae00012ffdbde', 'D')
, ('5e7c817c9ca5540012ea6cba', 'E')
;
数据类型和约束取决于您的实际用例

SELECT *
FROM   my_table m
LEFT   JOIN updated_by_translation u USING (updated_by);
MySQL最近也添加了一个VALUES语句

VALUES是MySQL 8.0.19中引入的DML语句

但每行都需要关键字ROW。因此:

...
   VALUES
     ROW('5eaf5d368141560012161636', 'A')
   , ROW('5e79d03e9abae00012ffdbb3', 'B')
   , ROW('5e7b501e9abae00012ffdbd6', 'C')
   , ROW('5e7b5b199abae00012ffdbde', 'D')
   , ROW('5e7c817c9ca5540012ea6cba', 'E')
...

如果需要在一行中处理多个值,可以使用递归CTE:

with replacements as (
      select '5eaf5d368141560012161636' as oldval, 'A' as newval union all
      select '5e79d03e9abae00012ffdbb3' as oldval, 'B' union all
      select '5e7b501e9abae00012ffdbd6' as oldval, 'C' union all
      select '5e7b5b199abae00012ffdbde' as oldval, 'D' union all
      select '5e7c817c9ca5540012ea6cba' as oldval, 'E'
     ),
     r as (
      select r.*, row_number() over (order by oldval) as seqnum
      from replacements r
     ),
     recursive cte (
      select r.seqnum, replace(t.updated_by, r.oldval, r.newval) as updated_by
      from my_table t join
           r
           on r.seqnum = 1
      union all
      select r.seqnum, replace(cte.updated_by, r.oldval, r.newval) as updated_by
      from cte t join
           r
           on r.seqnum = cte.seqnum + 1
     )
select cte.*
from cte
where seqnum = (select count(*) from replacements);

在没有任何聚合函数的情况下,GROUPBY子句永远不合适。如需进一步帮助,请参阅并注意,从潜在受访者的角度来看,“5e79d”的易懂程度不亚于“5E79D03E9ABAEE00012FFDBB3”。您使用的是MySQL还是Postgresql?更新的内容是什么?@ErwinBrandsetter。这会取代一行中的多个值吗?我真的很喜欢这个。它是可重用的.@ SNARE:为了重复使用,请考虑一个转换表。我加了一点。@Gordon:不,哎呀,这不适用于这个案子。
with replacements as (
      select '5eaf5d368141560012161636' as oldval, 'A' as newval union all
      select '5e79d03e9abae00012ffdbb3' as oldval, 'B' union all
      select '5e7b501e9abae00012ffdbd6' as oldval, 'C' union all
      select '5e7b5b199abae00012ffdbde' as oldval, 'D' union all
      select '5e7c817c9ca5540012ea6cba' as oldval, 'E'
     ),
     r as (
      select r.*, row_number() over (order by oldval) as seqnum
      from replacements r
     ),
     recursive cte (
      select r.seqnum, replace(t.updated_by, r.oldval, r.newval) as updated_by
      from my_table t join
           r
           on r.seqnum = 1
      union all
      select r.seqnum, replace(cte.updated_by, r.oldval, r.newval) as updated_by
      from cte t join
           r
           on r.seqnum = cte.seqnum + 1
     )
select cte.*
from cte
where seqnum = (select count(*) from replacements);