当前位置: 首页 > 知识库问答 >
问题:

合并两列并添加到一个新列中

有德业
2023-03-14

在PostgreSQL中,我想使用SQL语句合并两列并从中创建一个新列。

我正在考虑使用concat(…) ,但有更好的方法吗<最好的方法是什么?

共有3个答案

邹涵畅
2023-03-14

你检查字符串连接函数了吗?类似于:

update table_c set column_a = column_b || column_c 

应该有用。这里有更多

金飞翼
2023-03-14

您不需要存储列来以这种方式引用它。试试这个:

要设置:

CREATE TABLE tbl
  (zipcode text NOT NULL, city text NOT NULL, state text NOT NULL);
INSERT INTO tbl VALUES ('10954', 'Nanuet', 'NY');

我们可以看到我们有“合适的东西”:

\pset border 2
SELECT * FROM tbl;
+---------+--------+-------+
| zipcode |  city  | state |
+---------+--------+-------+
| 10954   | Nanuet | NY    |
+---------+--------+-------+

现在添加一个具有所需“列名”的函数,该函数将表的记录类型作为其唯一参数:

CREATE FUNCTION combined(rec tbl)
  RETURNS text
  LANGUAGE SQL
AS $$
  SELECT $1.zipcode || ' - ' || $1.city || ', ' || $1.state;
$$;

这将创建一个函数,只要指定了表名或别名,就可以将其用作表的列,如下所示:

SELECT *, tbl.combined FROM tbl;

显示如下:

+---------+--------+-------+--------------------+
| zipcode |  city  | state |      combined      |
+---------+--------+-------+--------------------+
| 10954   | Nanuet | NY    | 10954 - Nanuet, NY |
+---------+--------+-------+--------------------+

这是因为PostgreSQL首先检查实际列,但如果找不到实际列,并且标识符用关系名称或别名限定,它会查找如上所述的函数,并以行作为参数运行该函数,将结果作为列返回。如果愿意,您甚至可以在这样一个“生成的列”上建立索引。

因为您没有在每行中为复制的数据使用额外的空间,也没有在所有插入和更新上触发触发器,所以这通常比其他方法更快。

长孙知
2023-03-14

总的来说,我同意@kgrittn的建议。去争取吧

但要解决您关于concat()的基本问题:如果您需要处理空值,这是很有用的,而且无论您的问题还是您提到的问题都没有排除空值。

如果您可以排除空值,那么好的旧(SQL标准)连接运算符||仍然是最佳选择,@luis的答案很好:

SELECT col_a || col_b;

如果您的任何列都可以为空,则在这种情况下结果将为空。您可以使用COALESCE进行防御:

SELECT COALESCE(col_a, '') || COALESCE(col_b, '');

但随着更多的争论,这很快就会变得乏味。这就是输入的地方,它从不返回null,即使所有参数都为null也是如此。手册:

忽略NULL参数。

SELECT concat(col_a, col_b);

这两个备选方案的另一个极端情况是,所有输入列都为null,在这种情况下,我们仍然会得到一个空字符串。改为获取null:

SELECT CASE
          WHEN col_a IS NULL THEN col_b
          WHEN col_b IS NULL THEN col_a
          ELSE col_a || col_b
       END;

随着列的增加,这会变得更加复杂。同样,使用concat(),但添加对特殊条件的检查:

SELECT CASE WHEN (col_a, col_b) IS NULL THEN NULL
            ELSE concat(col_a, col_b) END;

这是如何工作的
(列a,列b)是行(列a,列b)的简写。并且,只有当所有列都为null时,行类型才为null。详细说明:

  • 一组列上的Not NULL约束

此外,使用concat_ws()在元素之间添加分隔符(ws表示“with分隔符”)。

就像凯文回答的那样:

SELECT $1.zipcode || ' - ' || $1.city || ', ' || $1.state;

在PostgreSQL 8.3中准备空值很乏味(没有conat())。一种方式(多种方式):

SELECT COALESCE(
         CASE
            WHEN $1.zipcode IS NULL THEN $1.city
            WHEN $1.city    IS NULL THEN $1.zipcode
            ELSE $1.zipcode || ' - ' || $1.city
         END, '')
       || COALESCE(', ' || $1.state, '');

concat()concat\u ws()是稳定的函数,而不是不可变的,因为它们可以调用依赖于语言环境设置的数据类型输出函数(如timestatz\u out)<汤姆·莱恩的解释。

这禁止在索引表达式中直接使用它们。如果您知道结果在您的情况下实际上是不可变的,您可以使用IMMUTABLE函数包装器来解决这个问题。此处示例:

  • PostgreSQL是否支持“不区分重音”的排序规则
 类似资料:
  • 问题内容: 我的MySQL表具有以下结构: 我想将以上三列合并为一列,如下所示: 我想将此“组合”列添加到表的末尾而不破坏原始的3个字段。 问题答案: 创建列: 更新当前值: 自动更新所有未来值:

  • 问题内容: CREATE TABLE logistics ( id int primary key, campaign VARCHAR(255), event_type VARCHAR (255), date_offered VARCHAR (255), date_ordered DATE, date_delivered DATE, date_recorded DATE, date_complet

  • rank ▲ ✰ vote url 65 357 50 683 url 合并两个列表 怎样合并两个列表? 例如: listone = [1,2,3] listtwo = [4,5,6] 我期待: mergedlist == [1, 2, 3, 4, 5, 6] 在Python中非常容易. mergedlist = listone + listtwo

  • 问题内容: 我有第1列和第2列,并希望将它们合并到同一表的第3列中。如果第2列为空,则显示第1列的值;如果第1列为空,则它们显示第2列的数据。如果它们都为空,则显示为空。我尝试了两件事: 1)使用CONCAT 。 仅当两个列都不为null时,它才合并列。否则,它只是将null声明为null。 2)使用(第1栏+第2栏)。 。 没有显示所需的输出。 我正在用Java编写此代码。谢谢 问题答案: us

  • 问题内容: 我正在尝试找到一种将两列合并为一个的方法,但是要保持列中的值“ 0”而不是单词的组合。 这些是我和其他人尝试过的: 有人可以让我知道我做错了吗? 问题答案: 我的猜测是,您使用的是MySQL,其中的运算符会进行加法运算,并将值自动转换为数字。如果值不是以数字开头,则转换后的值为。 所以试试这个: 两种添加空间的方法:

  • 本文向大家介绍MySQL查询将两列合并为一个列?,包括了MySQL查询将两列合并为一个列?的使用技巧和注意事项,需要的朋友参考一下 您可以为此使用功能。在该函数中,它从列中返回第一个NON NULL值。为了理解这个概念,让我们首先创建一个演示表 使用insert命令在表中插入一些记录。查询如下- 现在,您可以使用select语句显示表中的所有记录。查询如下- 以下是输出 这是将两列合并为一个查询的