segunda-feira, 8 de agosto de 2011

Função isdigit no Postgres


Função isdigit no Postgres

Esta função escalar excelente para testar se um derterminado campo tem strings, letras ou apenas números em Postgres.

Retorna true para verdadeiro caso seja apenas números e false para falso, caso encontre textos dentro do campo.

Espero ter ajudado.

Segue fonte abaixo:

-- apagar se existir 
DROP FUNCTION IF EXISTS usf_isdigit(text);
CREATE FUNCTION usf_isdigit(text) RETURNS BOOLEAN AS
$$
--
-- Nome Artefato/Programa..: usf_isdigit.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) adaptado de Manuel Sugawara em http://bytes.com/topic/postgresql/answers/174214-determine-if-string-digit
-- Data Inicio ............: 08/07/2011
-- Data Atualizacao........: 12/04/2018
-- Versao..................: 0.03
-- Compilador/Interpretador: PostgreSql
-- Sistemas Operacionais...: Linux/Windows
-- SGBD....................: Postgres 8.x/9.x/10.x
-- Kernel..................: Nao informado!
-- Finalidade..............: store procedure (user store function - usf) para testa se um campo eh digito ou nao, retorna true para verdadeiro e false para falso 
-- OBS.....................: 
--

SELECT CASE WHEN (array_upper(string_to_array($1, '.'),1) > 2 ) THEN 
                FALSE 
            ELSE 
                $1 ~ '^(-)?\.|[0-9]+$' 
            END AS usf_isdigit
/*
Exemplo: 
 
SELECT usf_isdigit('ISSO É UM VALOR NUMERICO?'); -- retorna false
SELECT usf_isdigit('ISSO É UM VALOR N.UMER.IC.O?'); -- retorna false
SELECT usf_isdigit('ISSO É UM VALOR N.UMERICO?'); -- retorna false
SELECT usf_isdigit('3000'); --retorna true
SELECT usf_isdigit('2700.00'); --retorno true 
SELECT usf_isdigit('2700.00.00'); --retorno false

*/ 
$$ 
LANGUAGE SQL;

6 comentários:

  1. Olá Pelegrino !

    Expressão Regular is rox !

    Att,

    Sakamoto

    MyTraceLog - Registro de um DBA
    http://mytracelog.blogspot.com

    ResponderExcluir
  2. E se eu quiser que '2700.00' retorne True como sendo um número ? Como eu faço ?

    ResponderExcluir
    Respostas
    1. Corrigido!

      Por segurança alterei para usf_isdigit

      Favor testar !

      Obrigado por sugestão

      Excluir
    2. Antes era sp_isdigit
      E o regex era $1 ~ '^(-)?[0-9]+$'
      Agora eh $1 ~ '^(-)?\.|[0-9]+$'
      Sendo que se houverem mais de dois pontos não considera número.
      Vlw

      Excluir
    3. Funcionou perfeitamente, O Peregrino. Obrigado, ótimo!
      Henrique.

      Excluir