【问题标题】:Add a column in a table with the result of the concatenation of 2 fields of that row在表中添加一列,其结果是该行的 2 个字段的串联结果
【发布时间】:2013-02-24 07:38:11
【问题描述】:

我在一些我认为一定很简单的事情上遇到了一些麻烦。

我有一个表格,其中包含:

CREATE TABLE cities(  
 city_id INT PRIMARY KEY, 
 city_article TEXT,
 city_name  TEXT 
 ); 

因此,city_name 是一个简单的字段,例如名称为“PARIS”或“NEW YORK”。 city_article 大部分是空的,除了一些城市(比如法国城市)需要在他们前面写一篇文章,比如在数据库中设置为 'LA ROCHELLE' city_article = '洛杉矶' city_name = '罗谢尔'

我想创建一个包含 city_article 和 city_name 连接的新列,用“-”分隔,并用相同的“-”替换每个空格。

所以如果我们把像“纽约”这样的东西分开 city_article = 'THE' city_name = '纽约'

第三列是 city_concatenated = '纽约'

诀窍是因为不是所有城市都有文章,所以我不希望'PARIS'这样的城市在手术后变成'-PARIS'。

有没有这样的方法可以轻松做到这一点?

TL;DR:如何创建一个新列,其中包含 2 个其他列的结果,其中一个可以为 NULL,另一个必须将每个空格替换为 '-' 而不是在它不是的地方放置一个 '-'由于缺少第一个字段而需要。

【问题讨论】:

    标签: mysql sql database concatenation


    【解决方案1】:

    将第一个破折号放在COALESCE 语句中:

    SELECT COALESCE(city_article + '-','') + REPLACE(city_name, ' ', '-')
    

    【讨论】:

      【解决方案2】:

      我不确定City_article 中是否可以有一个空字符串,但我假设这可能会发生:

      SELECT  CONCAT(CASE WHEN City_Article = '' OR City_Article IS NULL THEN '' ELSE CONCAT(City_Article, '-') END, REPLACE(city_name, ' ', '-'))
      FROM    Cities;
      

      就将其添加为列而言,我不会。由于 MySQL 不允许计算列,我建议创建一个存储该列定义的视图。这样可以确保全名始终是最新的,并且如果文章或城市名称更新,则不需要更新额外的列:

      CREATE VIEW Cities_Ext 
      AS
      SELECT  City_ID,
              City_Article,
              City_Name,
              CONCAT(CASE WHEN City_Article = '' OR City_Article IS NULL THEN '' ELSE CONCAT(City_Article, '-') END,REPLACE(city_name, ' ', '-')) AS FullName
      FROM    Cities;
      

      Example on SQL Fiddle

      【讨论】:

      • 谢谢,我什至不知道视图的存在。这是否意味着对于我在城市中插入的每个新行,视图都会自动更新?
      • 视图只不过是一个存储的查询,所以是的,如果你更新表,视图的输出也会更新
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多