您不需要存储列来以这种方式引用它。试试这个:
要设置:
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首先检查实际列,但如果找不到实际列,并且标识符用关系名称或别名限定,它会查找如上所述的函数,并以行作为参数运行该函数,将结果作为列返回。如果愿意,您甚至可以在这样一个“生成的列”上建立索引。
因为您没有在每行中为复制的数据使用额外的空间,也没有在所有插入和更新上触发触发器,所以这通常比其他方法更快。
总的来说,我同意@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。详细说明:
此外,使用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
函数包装器来解决这个问题。此处示例:
问题内容: 我的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语句显示表中的所有记录。查询如下- 以下是输出 这是将两列合并为一个查询的