Postgresql

NULL 值導致文本連接的 SELECT 結果中出現空白行

  • August 2, 2019

我有一個查詢,用於生成一些文本以創建一些 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_typeNULL引起的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)

引用自:https://dba.stackexchange.com/questions/244345