Subject: Postgres View DDL

From: Sam Stearns <[email-masked]>
Date: Wed, 16 Oct 2024 14:33:37 -0700

Howdy,

I have an Oracle view that's been converted for Postgres.  This block of
code in the Oracle view DDL:

TO_NUMBER (NVL (REGEXP_REPLACE (broker_mc, '[^0-9]+', ''), 0)),
TO_NUMBER (NVL (REGEXP_REPLACE (carrier_mc, '[^0-9]+', ''), 0)),
TO_NUMBER (NVL (REGEXP_REPLACE (freight_forwarder_mc, '[^0-9]+', ''), 0)),

has been converted for Postgres as:

(coalesce(REGEXP_REPLACE(broker_mc, '[^0-9]+', '', 'g'), 0))::numeric ,
(coalesce(REGEXP_REPLACE(carrier_mc, '[^0-9]+', '', 'g'), 0))::numeric ,
(coalesce(REGEXP_REPLACE(freight_forwarder_mc, '[^0-9]+', '', 'g'),
0))::numeric ,

which is throwing the following error:

ERROR:  COALESCE types text and integer cannot be matched
LINE 43: ...ce(REGEXP_REPLACE(broker_mc, '[^0-9]+', '', 'g'), 0))::numer...

                         ^
I have been looking through:

https://www.postgresql.org/docs/current/functions-conditional.html#FUNCTIONS-COALESCE-NVL-IFNULL
https://www.postgresql.org/docs/current/typeconv-union-case.html

but I'm not seeing a way to resolve it.  Would anyone be able to advise how
to correct this for Postgres, please?

Thanks,

Sam

-- 

*Samuel Stearns*
Lead Database Administrator
*c:* 971 762 6879 | *o:* 503 672 5115 | DAT.com
<https://www.dat.com/?utm_medium=email&utm_source=DAT_email_signature_link>

---

From: Sam Stearns <[email-masked]>
Date: Wed, 16 Oct 2024 14:42:28 -0700

Tried changing to this:

    (coalesce(REGEXP_REPLACE(broker_mc::numeric, '[^0-9]+', '', 'g'), 0)),
    (coalesce(REGEXP_REPLACE(carrier_mc::numeric, '[^0-9]+', '', 'g'), 0)),
    (coalesce(REGEXP_REPLACE(freight_forwarder_mc::numeric, '[^0-9]+', '',
'g'), 0)),

but that throws this error:

ERROR:  function regexp_replace(numeric, unknown, unknown, unknown) does
not exist
LINE 46:     (coalesce(REGEXP_REPLACE(broker_mc::numeric, '[^0-9]+', ...
                                    ^
HINT:  No function matches the given name and argument types. You might
need to add explicit type casts.

Sam

On Wed, Oct 16, 2024 at 2:33 PM Sam Stearns <[email-masked]> wrote:

> but I'm not seeing a way to resolve it.  Would anyone be able to advise
> how to correct this for Postgres, please?
>
> Thanks,
>
> Sam
>
> --
>
> *Samuel Stearns*

-- 

*Samuel Stearns*

---

From: "David G. Johnston" <[email-masked]>
Date: Wed, 16 Oct 2024 14:47:27 -0700

>     (coalesce(REGEXP_REPLACE(broker_mc::numeric, '[^0-9]+', '', 'g'), 0)),

Both parts of the coalesce need to be integer.  Therefore:

regexp_replace(…)::integer

In short, the output of the text manipulation better be something that can
be cast to integer if you want coalesce to produce an integer.

David J.

---

From: William Alves Da Silva <[email-masked]>
Date: Wed, 16 Oct 2024 19:04:17 -0300

Hello Sam.

I think you want this:

SELECT COALESCE(regexp_replace('abc12345'::TEXT,  '[^0-9]+', '', 'g')::NUMERIC, 0);

The coalesce need the same type from origin field, or you cast the result from regex to interger/numeric etc, or you use cast ‘0’ instead of 0;

Regards,
William Alves.

> On 16 Oct 2024, at 18:42, Sam Stearns <[email-masked]> wrote:
> 
> Tried changing to this:
> 
>     (coalesce(REGEXP_REPLACE(freight_forwarder_mc::numeric, '[^0-9]+', '', 'g'), 0)),
> 
> ERROR:  function regexp_replace(numeric, unknown, unknown, unknown) does not exist
> HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
> 
> Sam
> 
> On Wed, Oct 16, 2024 at 2:33 PM Sam Stearns <[email-masked] <mailto:[email-masked]>> wrote:
>> Howdy,
>> 
>> I have an Oracle view that's been converted for Postgres.  This block of code in the Oracle view DDL:
>> 
>> (coalesce(REGEXP_REPLACE(freight_forwarder_mc, '[^0-9]+', '', 'g'), 0))::numeric ,
>> 
>> but I'm not seeing a way to resolve it.  Would anyone be able to advise how to correct this for Postgres, please?
>> 
>> Thanks,
>> 
>> Sam
>> 
>> --
>> Samuel Stearns
>> c: 971 762 6879 | o: 503 672 5115 | DAT.com
>> 
> Samuel Stearns
> c: 971 762 6879 | o: 503 672 5115 | DAT.com
>

---

From: Sam Stearns <[email-masked]>
Date: Wed, 16 Oct 2024 16:07:29 -0700

Just adopting William's advice and changing to this:

(coalesce(REGEXP_REPLACE(broker_mc::text, '[^0-9]+', '', 'g')::numeric, 0)),
(coalesce(REGEXP_REPLACE(carrier_mc::text, '[^0-9]+', '', 'g')::numeric,
0)),
(coalesce(REGEXP_REPLACE(freight_forwarder_mc::text, '[^0-9]+', '',
'g')::numeric, 0)),

has resolved the problem.  Thank you, William and David!  Learning a lot
here.  Appreciate all the help.

Sam

On Wed, Oct 16, 2024 at 3:04 PM William Alves Da Silva <
[email-masked]> wrote:

> The coalesce need the same type from origin field, or you cast the result
> from regex to interger/numeric etc, or you use cast ‘0’ instead of 0;
>
> Regards,
> William Alves.
>

-- 

*Samuel Stearns*