Conversão dos tipos MONEY e DATE no PostgreSQL

Amigos, estou com um problema que penso ser simples, mas, como sou novo no Java, tenho sempre minhas dúvidas.

Na realidade, o problema não é o Java, mas o SQL.

Estou trabalhando com JavaFX, Netbeans e PostgreSQL.

Fiz um comando SQL que, a partir do conteúdo de 01 textfield, faz uma pesquisa por todos os campos da tabela, verificando, através de substring, se aquele conteúdo existe.

O comando funciona muito bem, enquanto estou referenciando as colunas que têm tipo de dados CHARACTER VARYING. Porém, quando insiro uma coluna do tipo MONEY ou do tipo DATE, ocorrem vários erros de conversão.

Nas linhas em que utilizo esses dois tipos de dados, utilizo o comando CAST, para fazer a conversão. Exemplos:

“OR data_cadastro ILIKE CAST (’” + data + “’ AS DATE)”

e

“OR mensalidade = CAST(” + mensalidadeSQL + " AS MONEY) "

Onde “data” e “mensalidadeSQL” são variáveis do tipo String.

Colei, abaixo, o comando SQL inteiro. Comentei as partes do comando que fazem ele falhar.

Se puderem me ajudar, agradeço, MUITO.

Colega @jmenezes , você que é especialista em Postgre, pode me ajudar com isso?

Segue o comando:

"SELECT * FROM tblcadcliforn "
        + "WHERE cli_ou_forn ILIKE '" + qualquer + "' "
        + "OR nome ILIKE '" + qualquer + "' "
        + "OR obs ILIKE '" + qualquer + "' "
        + "OR nome_resumido ILIKE '" + qualquer + "' "  
        + "OR razao_social ILIKE '" + qualquer + "' "
        + "OR nome_fantasia ILIKE '" + qualquer + "' "
        + "OR cpf ILIKE '" + qualquer + "' "
        + "OR rg ILIKE '" + qualquer + "' "
        + "OR passaporte ILIKE '" + qualquer + "' "
        + "OR cnpj ILIKE '" + qualquer + "' "
        + "OR insc_estadual ILIKE '" + qualquer + "' "
        + "OR insc_municipal ILIKE '" + qualquer + "' "
//        + "OR mensalidade = CAST(" + mensalidadeSQL + " AS MONEY) "
        + "OR email ILIKE '" + qualquer + "' "
        + "OR regularidade ILIKE '" + qualquer + "' "
//        + "OR  inicio_contrato = CAST('" + data + "' AS DATE) "
        + "OR nome_adm1 ILIKE '" + qualquer + "' "
        + "OR fones_adm1 ILIKE '" + qualquer + "' "
        + "OR nome_adm2 ILIKE '" + qualquer + "' "
        + "OR fones_adm2 ILIKE '" + qualquer + "' "
        + "OR cep ILIKE '" + qualquer + "' "
        + "OR logradouro ILIKE '" + qualquer + "' "
        + "OR endereco ILIKE '" + qualquer + "' "
        + "OR numero ILIKE '" + qualquer + "' "
        + "OR complemento ILIKE '" + qualquer + "' "
        + "OR bairro ILIKE '" + qualquer + "' "
        + "OR cidade ILIKE '" + qualquer + "' "
        + "OR estado ILIKE '" + qualquer + "' "
        + "OR pais ILIKE '" + qualquer + "' "
//        + "OR data_nasc  = CAST('" + data + "' AS DATE) "
        + "OR sexo ILIKE '" + qualquer + "' "
        + "OR orgao_emissor ILIKE '" + qualquer + "' "
//        + "OR data_emissao  = CAST('" + data + "' AS DATE) "
        + "OR pis_pasep ILIKE '" + qualquer + "' "
        + "OR naturalidade ILIKE '" + qualquer + "' "
        + "OR nome_pai ILIKE '" + qualquer + "' "
        + "OR nome_mae ILIKE '" + qualquer + "' "
        + "OR tit_eleitor ILIKE '" + qualquer + "' "
        + "OR reservista ILIKE '" + qualquer + "' "
        + "OR skype ILIKE '" + qualquer + "' "
        + "OR website ILIKE '" + qualquer + "' "
        + "OR facebook ILIKE '" + qualquer + "' "
        + "OR instagram ILIKE '" + qualquer + "' "
        + "OR twiter ILIKE '" + qualquer + "' "
        + "OR ponto_referencia ILIKE '" + qualquer + "' "
        + "OR sexo_outro ILIKE '" + qualquer + "' "
        + "OR nacionalidade ILIKE '" + qualquer + "' ORDER BY nome_resumido"; 
//        + "OR data_cadastro = CAST ('" + data + "' AS DATE) "
//        + "OR hora_cadastro = CAST('" + data + "' AS DATE) "
//        + "OR data_alteracao = CAST('" + data + "' AS DATE) "
//        + "OR hora_alteracao = CAST('" + data + "' AS DATE) "
//        + "OR dia_vencimento = CAST('" + data + "' AS DATE) "

Valeu!

ILIKE CAST??? Isso é possível?

Qnd for assim vc testa o SQL no banco primeiro pra ter ctz se retorna algum resultado.

O correto (no java) é:

...OR data_cadastro CAST ('" + data + "' AS DATE);

Data:

image

Formato charvar

image

Olha esse link, talvez te ajude a entender melhor:
https://www.postgresqltutorial.com/postgresql-cast/


E outra, quais erros apresentam quando vc tenta utilizar essa sql?

1 curtida

é muito OR pra uma SQL só … reveja isso … é bem inviável isso.

3 curtidas

Conforme o amigo @Dragoon disse, essa Query terá um péssimo desempenho devido a quantidade de cláusulas OR aplicadas, prefira que o usuário defina parâmetros de busca, assim você torna o SQL mais simples, menor e mais assertivo, podendo assim aplicar índices únicos e combinados para performar ainda mais a consulta.

2 curtidas

Valeu, @rodriguesabner!

O problema era só sintaxe, mesmo.

Essa sua dica resolveu tudo :point_down:

O correto (no java) é:

...OR data_cadastro CAST ('" + data + "' AS DATE);

Sobre a pergunta: “ILIKE CAST` ??? Isso é possível?” : a resposta é NÃO SEI. HeHe. Estava em uma tentativa-e-erro, tentando fazer a SQL da forma que eu queria. Na realidade, só passei a conhecer o ILIKE, hoje, lendo a documentação do postgre. Assim como falei, sou novo em Java e estou RECOMEÇANDO a programar. Enferrujado (apesar de nunca ter sido um profissional da área).

“E outra, quais erros apresentam quando vc tenta utilizar essa sql?” :point_right: Os erros que apresentavam eram relacionados a sintaxe e conversões. Como eu não estava utilizando a sintaxe correta, ele não conseguia converter.

Obrigadão!

Pois é, @Jonathan_Medeiros .

Também acho que tem muito “OR” na SQL e acredito em você, quando fala na performance. Principalmente, quando o banco começar a crescer.

Porém preciso fazer essa tipo consulta (e acabei conseguindo), ou seja, digito algo em um textfield e a consulta procura em cada registro / em cada coluna da tabela.

E pior: acho que, no futuro vai piorar ainda mais, pois quero que a mesma informação do textfield seja procurada nas tabelas relacionadas a esta atual.

Você poderia me dar uma solução melhor, para fazer essa mesma tarefa?

(volto a dizer: sou iniciante. Preciso de ajuda).

De toda forma, agradeço. Seu aviso já me “acendeu uma luz amarela, na cabeça”.

:+1::+1::+1::+1::+1::+1::+1::+1::+1::+1:

Vou te fazer a mesma pergunta que fiz ao @Jonathan_Medeiros:

Você poderia me dar uma solução melhor, para fazer essa mesma tarefa?

Assim com já falei, sou iniciante.

De toda forma, muito obrigado.

Da pra melhorar com certeza é com a UI que isso pode ser melhorado ou seja construir a sql em tempo de execução é a melhor forma do jeito que fez é sem cabimento.

Se é iniciante busca estudar mais.

2 curtidas