Eu tenho uma consulta para produzir algum texto para criar algum texto de VALORES para colocar em um arquivo .sql para inserir algumas linhas. Eu recebo uma linha em branco nos resultados:
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)
Fazendo um select *
, fica bem claro que está sendo causado por obj_type
ser NULL para obj_id
2:
postgres=# SELECT * FROM il2.objects WHERE obj_id < 11;
obj_id | obj_type
--------+---------------
10 | Instrument
1 | ScienceDomain
2 |
3 | PIs
(4 rows)
(confirmando que é NULL):
postgres=# SELECT * FROM il2.objects WHERE obj_type IS NULL;
obj_id | obj_type
--------+----------
2 |
Por que o resultado do primeiro está SELECT
me dando uma linha em branco?
Mesmo o elenco obj_type::text
ainda me deu uma linha em branco.
Informações Adicionais: O esquema, pelo que vale:
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)
Use a função COALESCE para retornar o valor atual ou uma string vazia.
db<>fique aqui
Como a concatenação
NULL
com qualquer tipo de caractere (ou a maioria dos outros tipos, sendo os tipos de matriz uma exceção notável) resulta emNULL
. Relacionado:A representação de
NULL
depende do seu cliente. Alguns soletramNULL
, alguns (incl. psql) não colocam nada em seu lugar. Muitas vezes isso é configurável.A conversão
NULL
para (quase) qualquer tipo ainda retornaNULL
- de outro tipo de dados.Você considerou
COPY
ou o equivalente psql\copy
?Outras soluções
Se o seu exemplo não for simplificado, você pode apenas selecionar valores ROW inteiros:
Se você precisar desse formato específico, use
format()
para simplificar. Funciona comNULL
valores prontos para uso:Você obtém
NULL
(sem aspas) no lugar deNULL
valores (que é distinto''
e pode ter que ser distinguível).db<>fiddle aqui (adicionado ao violino existente de McNets, kudos)