> O problema é que o campo está sem mascara e telefones convencionais juntos,
> ou seja aquela bagunça de sempre,
> exemplo:
> 48-33333333
> 49-9999-0000
> 049-9999-0000
> (49)9999-0000
> (49)99990000
>
> por isso queria ver se alguem tinha alguma função para compartilhar, algo do
> tipo regex, pois não consigo entender como funciona essa parada.

Opa, veja se isso te ajuda. São duas funções: uma para formatar os
números removendo caracteres não numéricos e a outra que compara e
verifica se é um número de telefone móvel começando com os dígitos 8
ou 9 (considerando que esta é a regra):

CREATE OR REPLACE FUNCTION uf_format_phone_number(
    a_number BPCHAR
)
RETURNS BPCHAR AS
$BODY$
DECLARE
    lc_number BPCHAR;
    lc_char   BPCHAR;
    li_len INTEGER;
BEGIN
    li_len := LENGTH(a_number);
    lc_number := '';

    FOR i IN 1..li_len LOOP
        lc_char = SUBSTR(a_number,i,1);

        IF POSITION(lc_char IN '0123456789')<=0 THEN
            CONTINUE;
        END IF;

        lc_number := lc_number || lc_char;
    END LOOP;

    lc_number := CAST(CAST(lc_number AS NUMERIC(20,0)) AS BPCHAR);

    RETURN lc_number;

END;
$BODY$
LANGUAGE 'plpgsql' IMMUTABLE;


CREATE OR REPLACE FUNCTION uf_is_mobile_number(
    a_number BPCHAR
)
RETURNS BOOLEAN AS
$$
    SELECT uf_format_phone_number(a_number) ~ '^[1-9]{2}[8-9][0-9]{7,8}$'
$$
LANGUAGE SQL;

Eu fiz estas funções conferindo a explicação de um post no
StackOverflow [1] sobre regex para o mesmo fim.

Para verificar se um número é ou não de telefonia móvel, use a função
'uf_is_mobile_number':

SELECT uf_is_mobile_number('(099)9999-9999');


Referências:
[1] 
http://pt.stackoverflow.com/questions/46672/como-fazer-uma-express%C3%A3o-regular-para-telefone-celular


TIAGO J. ADAMI
http://www.adamiworks.com
@tiadami
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a