我有一个查询,用于生成一些文本以创建一些 VALUES 文本以放入 .sql 文件中以插入一些行。我在结果中得到一个空行:
postgres=# SELECT ' (' || obj_id || ', ''' || obj_type || '''),' FROM il2.objects WHERE obj_id < 11 ORDER BY obj_id;
?column?
-------------------------
(1, 'ScienceDomain'),
(3, 'PIs'),
(10, 'Instrument'),
(4 rows)
做 a select *
,很明显它是由 2 的obj_type
NULL引起的obj_id
:
postgres=# SELECT * FROM il2.objects WHERE obj_id < 11;
obj_id | obj_type
--------+---------------
10 | Instrument
1 | ScienceDomain
2 |
3 | PIs
(4 rows)
(确认它为NULL):
postgres=# SELECT * FROM il2.objects WHERE obj_type IS NULL;
obj_id | obj_type
--------+----------
2 |
为什么第一个结果SELECT
给我一个空白行?
即使是铸造obj_type::text
仍然给了我一个空白行。
附加信息:架构,它的价值:
postgres=# \d il2.objects
Table "il2.objects"
Column | Type | Collation | Nullable | Default
----------+-------------------+-----------+----------+----------------------------------
obj_id | integer | | not null | generated by default as identity
obj_type | character varying | | |
Indexes:
"objects_pkey" PRIMARY KEY, btree (obj_id)
使用 COALESCE 函数返回当前值或空字符串。
db<>在这里摆弄
因为
NULL
与任何字符类型(或大多数其他类型,数组类型是一个明显的例外)连接会导致NULL
. 有关的:的表示
NULL
取决于您的客户。有些拼写出来NULL
,有些(包括psql)什么也没写。通常这是可配置的。转换
NULL
为(几乎)任何类型仍然返回NULL
- 另一种数据类型。您是否考虑
COPY
过或psql 等价物\copy
?其他解决方案
如果您的示例没有简化,您可能只选择整个 ROW 值:
如果您需要该特定格式,请使用
format()
以使其简单。适用于NULL
开箱即用的值:你得到
NULL
(未引用)代替NULL
值(这与值不同''
并且可能必须是可区分的。)db<>fiddle here(添加到 McNets 的现有 fiddle 中,赞)