Postgresql
NULL 值導致文本連接的 SELECT 結果中出現空白行
我有一個查詢,用於生成一些文本以創建一些 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)
為什麼第一個結果
SELECT
給我一個空白行?因為
NULL
與任何字元類型(或大多數其他類型,數組類型是一個明顯的例外)連接會導致NULL
. 有關的:的表示
NULL
取決於您的客戶。有些拼寫出來*NULL
*,有些(包括psql)什麼也沒寫。通常這是可配置的。即使是鑄造
obj_type::text
仍然給了我一個空白行。轉換
NULL
為(幾乎)任何類型仍然返回NULL
- 另一種數據類型。我有一個查詢,用於生成一些文本以創建一些
VALUES
文本以放入 .sql 文件中以插入一些行。您是否考慮
COPY
過或psql 等價物\copy
?其他解決方案
如果您的範例沒有簡化,您可能只選擇整個 ROW 值:
SELECT o -- whole row FROM il2.objects o WHERE obj_id < 11 ORDER BY obj_id;
如果您需要該特定格式,請使用
format()
以使其簡單。適用於NULL
開箱即用的值:SELECT format('(%s, %L),', obj_id, obj_type) FROM objects;
你得到*
NULL
*(未引用)代替NULL
值(這與值不同''
並且可能必須是可區分的。)db<>fiddle here(添加到 McNets 的現有 fiddle 中,cudos)