Return Non-Numeric Values from a PostgreSQL Database Column

The following PostgreSQL examples return only those rows that don’t have a numeric value in a given column.

Sample Data

Let’s create a table with sample data:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    c1 varchar(255)
);

INSERT INTO t1 (c1) VALUES 
    ('0'),
    ('1'),
    ('+1'),
    ('-1'),
    ('00.00'),
    ('73.45'),
    ('+73.45'),
    ('-73.45'),
    ('.246'),
    ('-.34e7'),
    ('12.e-3'),
    ('1.2e+4'),
    ('a'),
    ('9afc'),
    ('e7'),
    ('+e0'),
    ('Ten'),
    ('5 Dollars');

SELECT * FROM t1;

The table has now been created and contains the following data:

    c1     
-----------
 0
 1
 +1
 -1
 00.00
 73.45
 +73.45
 -73.45
 .246
 -.34e7
 12.e-3
 1.2e+4
 a
 9afc
 e7
 +e0
 Ten
 5 Dollars

The column is a varchar(255) column, so it’s not numeric. It can (and does) contain numbers but these are stored as character data. It can also contain arbitrary text (which it does).

Return the Non-Numeric Values

We can use the following query to return the non-numeric values from the above table:

SELECT c1
FROM t1 
WHERE c1 !~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Result:

    c1     
-----------
 12.e-3
 a
 9afc
 e7
 +e0
 Ten
 5 Dollars

Return Non-Integers

If we only want to return non-integers, the query can be a lot simpler:

SELECT c1
FROM t1 
WHERE c1 !~ '^[0-9]+$';

Result:

    c1     
-----------
 +1
 -1
 00.00
 73.45
 +73.45
 -73.45
 .246
 -.34e7
 12.e-3
 1.2e+4
 a
 9afc
 e7
 +e0
 Ten
 5 Dollars

Doesn’t Contain Numeric Data

If we want to find rows that don’t contain numeric data, we can do the following:

SELECT c1 
FROM t1 
WHERE c1 !~ '[0-9]+';

Result:

 c1  
-----
 a
 Ten

In PostgreSQL, !~ is a case-sensitive operator that is used for returning values that don’t match the given regular expression. For case-insensitive matches, use !~*.

You can use ~ to return all rows that do match the regular expression (and ~* for case-insensitive matches).