0

我在一些我认为必须非常简单的事情上遇到了一些麻烦。

我有一个包含以下内容的表格:

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 = 'LA' city_name = 'ROCHELLE'

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

因此,如果我们在 city_article = 'THE' city_name = 'NEW YORK' 中使用类似 'THE NEW YORK' 的内容

第三列是 city_concatenated = 'THE-NEW-YORK'

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

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

TL; DR:我如何创建一个新列,其中包含其他 2 个列的结果,其中一个可以为 NULL,另一个必须将每个空格替换为“-”,而不需要在不需要的地方放置“-”,因为没有第一个字段。

4

2 回答 2

1

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

SELECT COALESCE(city_article + '-','') + REPLACE(city_name, ' ', '-')
于 2013-03-08T17:06:50.973 回答
1

我不确定您是否可以在 中有一个空字符串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;

SQL Fiddle 示例

于 2013-03-08T17:47:23.477 回答