Обсуждение: Specifying text to substitute for NULLs in selects

Поиск
Список
Период
Сортировка

Specifying text to substitute for NULLs in selects

От
pcreso@pcreso.com
Дата:
Hi,

I can specify the text used to represent a null value in output from copy, but I'd like to do something similar is
selectoutput, eg: all NULL values are represented by NA or NaN. 

I can't find anything in the docs about this.

This could be managed using case statements around all the columns in the query, but is there a simpler way, like
settinga system variable to specify this? 

Thanks,

  Brent Wood

Re: Specifying text to substitute for NULLs in selects

От
Ivan Sergio Borgonovo
Дата:
On Thu, 6 Nov 2008 17:44:42 -0800 (PST)
pcreso@pcreso.com wrote:

>
> Hi,
>
> I can specify the text used to represent a null value in output
> from copy, but I'd like to do something similar is select output,
> eg: all NULL values are represented by NA or NaN.
>
> I can't find anything in the docs about this.
>
> This could be managed using case statements around all the columns
> in the query, but is there a simpler way, like setting a system
> variable to specify this?

wtw_drupal=# create schema test;
CREATE SCHEMA
wtw_drupal=# create table test.test(c1 text);
CREATE TABLE
wtw_drupal=# insert into test.test values(null);
INSERT 0 1
wtw_drupal=# insert into test.test values('test');
INSERT 0 1
wtw_drupal=# \copy test.test to stdout null as 'BANANA'
BANANA
test
wtw_drupal=# drop schema test cascade;
NOTICE:  drop cascades to table test.test
DROP SCHEMA

everything clearly explained in the COPY manual:
http://www.postgresql.org/docs/8.1/static/sql-copy.html

--
Ivan Sergio Borgonovo
http://www.webthatworks.it


Re: Specifying text to substitute for NULLs in selects

От
Said Ramirez
Дата:
I think you are more after something like

SELECT CASE WHEN foo IS NULL THEN 'NA' END FROM bar.
   -Said

Ivan Sergio Borgonovo wrote:
> On Thu, 6 Nov 2008 17:44:42 -0800 (PST)
> pcreso@pcreso.com wrote:
>
>  >
>  > Hi,
>  >
>  > I can specify the text used to represent a null value in output
>  > from copy, but I'd like to do something similar is select output,
>  > eg: all NULL values are represented by NA or NaN.
>  >
>  > I can't find anything in the docs about this.
>  >
>  > This could be managed using case statements around all the columns
>  > in the query, but is there a simpler way, like setting a system
>  > variable to specify this?
>
> wtw_drupal=# create schema test;
> CREATE SCHEMA
> wtw_drupal=# create table test.test(c1 text);
> CREATE TABLE
> wtw_drupal=# insert into test.test values(null);
> INSERT 0 1
> wtw_drupal=# insert into test.test values('test');
> INSERT 0 1
> wtw_drupal=# \copy test.test to stdout null as 'BANANA'
> BANANA
> test
> wtw_drupal=# drop schema test cascade;
> NOTICE:  drop cascades to table test.test
> DROP SCHEMA
>
> everything clearly explained in the COPY manual:
> http://www.postgresql.org/docs/8.1/static/sql-copy.html
>
> --
> Ivan Sergio Borgonovo
> http://www.webthatworks.it
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>


Re: Specifying text to substitute for NULLs in selects

От
Ivan Sergio Borgonovo
Дата:
On Fri, 07 Nov 2008 15:20:24 -0500
Said Ramirez <sramirez@vonage.com> wrote:

> I think you are more after something like
>
> SELECT CASE WHEN foo IS NULL THEN 'NA' END FROM bar.

missing an else at least and...

wtw_drupal=# create table test.test(c1 int);
CREATE TABLE
wtw_drupal=# insert into test.test values(null);
INSERT 0 1
wtw_drupal=# insert into test.test values(1);
INSERT 0 1
wtw_drupal=# \copy (select case when c1 is null then 'NA' else c1
end from test.test) to stdout ERROR:  invalid input syntax for
integer: "NA" \copy: ERROR:  invalid input syntax for integer: "NA"

furthermore... even if c1 was text you may end up in output like:
'NA'
that will be hard to be discerned from a "normal" string.

BTW I just discovered that COPY doesn't work on view.

--
Ivan Sergio Borgonovo
http://www.webthatworks.it


Re: Specifying text to substitute for NULLs in selects

От
Mike Toews
Дата:
Said Ramirez wrote:
> I think you are more after something like
>
> SELECT CASE WHEN foo IS NULL THEN 'NA' END FROM bar.
>   -Said

An even simpler way to do this is using the COALESCE function:
http://www.postgresql.org/docs/current/interactive/functions-conditional.html

SELECT COALESCE(foo, 'NA') AS foo FROM bar;

will either return the value in the field(s) "foo" or 'NA' if it is
NULL. Keep in mind that you can't mix data types, like 'NaN'::text and
32.3::float in the result.

-Mike

Re: Specifying text to substitute for NULLs in selects

От
Mike Toews
Дата:
Mike Toews wrote:
> Keep in mind that you can't mix data types, like 'NaN'::text and
> 32.3::float in the result.

oh yeah, regarding mixing data types (in regards to the first post)...

A good exception is that you can use 'NaN' for floating point data
types, so:

    SELECT COALESCE(myval, 'NaN') as myval FROM foo;

where "myval" is a field with a floating-point data type. This maneuver
is sometimes preferred in some aggregates like sum() where you don't
want to take sums on incomplete sets since NULL is counted as 0 whereas
a single NaN value forces the resulting sum to be NaN.

There are other special floats like 'Infinity' and '-Infinity', which
can also be coalesced in for NULL float values:
http://www.postgresql.org/docs/current/interactive/datatype-numeric.html

-Mike