Ir para conteúdo
Fórum Script Brasil

Kakao

Membros
  • Total de itens

    463
  • Registro em

  • Última visita

Tudo que Kakao postou

  1. Nas versões anteriores à 9.1 tem que fazer assim: select id,nome, regexp_replace(trim(both from nome), E'(.*)\\s+(.*)', E'\\2, \\1') as nome_formatado from teste; Qual versão você está usando? select version();
  2. O código do Gigabyte fica mais simples mas com duas alterações: select id,nome, regexp_replace(trim(both from nome), '(.*)\s+(.*)', '\2, \1') as nome_formatado from teste; A primeira é o trim e a segunda é substituir o espaço na regexp por \s+ para o caso de haver mais de um espaço separando as partes.A expressão regular talvez seja mais lenta mas acho que mesmo assim vale a pena pela simplicidade.
  3. Acho que peguei o problema. Parece que há espaços antes e depois dos nomes. Então usei a função trim: drop table if exists teste; create table teste ( id integer, nome text ); insert into teste (id, nome) values (1, 'Julio Cezar Andrade'), (2, 'Fenando Henrique Cardoso'), (3, 'Antonio Carlos Magalhães'), (4, 'Pedro Álvares Cabral'), (5, 'Eduardo Henrique Cunha de Farias'), (6, 'Maria Lúcia da Silva Nunes'); select id, nome[array_length(nome, 1)] || ', ' || array_to_string(nome[1: array_length(nome, 1) - 1], ' ') as nome from ( select id, regexp_split_to_array(trim(both from nome), '\s+') as nome from teste ) s; id | nome ----+----------------------------------- 1 | Andrade, Julio Cezar 2 | Cardoso, Fenando Henrique 3 | Magalhães, Antonio Carlos 4 | Cabral, Pedro Álvares 5 | Farias, Eduardo Henrique Cunha de 6 | Nunes, Maria Lúcia da Silva No caso do Crhisnir parece que há um espaço entre "Damas" e "ceno" e neste caso não há o que fazer a não ser editar um a a um.
  4. Desta forma fica genérico para qualquer número de partes no nome: drop table if exists teste; create table teste ( id integer, nome text ); insert into teste (id, nome) values (1, 'Julio Cezar Andrade'), (2, 'Fenando Henrique Cardoso'), (3, 'Antonio Carlos Magalhães'), (4, 'Pedro Álvares Cabral'); select id, nome[array_length(nome, 1)] || ', ' || array_to_string(nome[1: array_length(nome, 1) - 1], ' ') as nome from ( select id, regexp_split_to_array(nome, '\s+') as nome from teste ) s; id | nome ----+--------------------------- 1 | Andrade, Julio Cezar 2 | Cardoso, Fenando Henrique 3 | Magalhães, Antonio Carlos 4 | Cabral, Pedro Álvares
  5. Fiquei com a impressão que você pegou o conceito.
  6. Usando o modelo proposto esta consulta retorna uma linha para cada peça select montadora_id, modelo_id, lote_id, secao, subsecao, posicao, lado from peca inner join lote using(lote_id) inner join modelo using(modelo_id) inner join montadora using(montadora_id) where l.proprietario_cpf = '12345678901' Fiz a seleção pelo CPF do proprietário. Na camada de apresentação você pode adicionar pontos e completar com zeros.
  7. Em vez de usar o tipo "integer" como a seguir create table t ( minha_coluna integer primary key, ... ); substitua o tipo "integer" pelo pseudo tipo "serial" que é um "integer" gerado por uma sequencia. A modelagem fica assim: tabela montadora: create table montadora ( montadora_id serial primary_key, montadora_nome varchar(100), etc... ); Tabela modelo: create table modelo ( modelo_id serial primary key, montadora_id integer references montadora_id (montadora_id), modelo_nome varchar(100), etc... ); Veja que a coluna montadora_id na tabela modelo faz referência à mesma coluna na tabela montadora. É a chamada chave estrangeira. A partir daqui como não sou do ramo vou colocar o meu entendimento. O lote faz referência a um veículo que pode ter mais de um serviço a ser executado. Por exemplo lataria capô e lataria porta esquerda. Então eu criaria uma tabela lote com os dados do veículo: create table lote ( lote_id serial primary key, modelo_id integer references modelo (modelo_id), chassis varchar(50), etc... ); E a tabela peça create table peca ( peca_id serial primary key, lote_id integer references lote(lote_id), secao smallint, subsecao smallint, posicao smallint, lado smallint ); As colunas posicao e lado podem ser char(1) "E", "D", "F", "T"
  8. Para auto incremento use o pseudo tipo serial: create table t ( minha_coluna serial primary key, ... ); Completar com zeros à esquerda constitui má prática. A formatação deve ser tratada na camada de apresentação. Explique o campo maior.
  9. Olá matrakaum, Vai postando as dúvidas que nós vamos tentando...
  10. Para quem é destinada a mensagem? Se for para o usuário o tratamento deve ser feito na camada de apresentação e não tem nada a ver com o banco de dados. Para não levantar uma exceção não use EXCEPTION. Use um dos outros níveis DEBUG, LOG, INFO, NOTICE, WARNING. Me parece que você quer INFO ou NOTICE. RAISE INFO 'Senha Incorreta!' http://www.postgresql.org/docs/current/static/plpgsql-errors-and-messages.html O RAISE como você percebeu só vai ser executado em caso de erro. O mensagem de erro pode ir apenas para o log, apenas para o cliente, para nenhum ou para ambos dependendo da configuração no arquivo postgresql.conf
  11. Eu acho que é isso: select itm.dataentr, codprod, prod.descricao, numentr, itm.qtdprod, itm.valortot * 1.0 / itm.qtdprod as valoruni from tabprod prod inner join itmentr itm using(codprod) inner join cabentr cab using(numentr) where codprod='00000681' and prod.medcontrol like 'S' order by numentr desc limit 1 Dá pra otimizar assim: select itm.dataentr, codprod, prod.descricao, numentr, itm.qtdprod, itm.valortot * 1.0 / itm.qtdprod as valoruni from tabprod prod inner join ( select distinct on (codprod, numentr) * from itmentr order by codprod, numentr desc ) itm using(codprod) inner join cabentr cab using(numentr) where codprod='00000681' and prod.medcontrol like 'S' Se você tirar o codprod='00000681' da condição você vai ter a última compra de cada produto. Mas se você realmente quer apenas um determinado produto: select itm.dataentr, codprod, prod.descricao, numentr, itm.qtdprod, itm.valortot * 1.0 / itm.qtdprod as valoruni from ( select * from tabprod where codprod='00000681' and medcontrol like 'S' ) prod inner join itmentr itm using(codprod) inner join cabentr cab using(numentr) order by numentr desc limit 1
  12. A única forma de garantir a ordem de retorno é usando a cláusula order by. Mesmo com o cluster não há garantia. O índice apenas torna mais rápido o retorno na ordem do índice pois basta consultar o índice ao invés de realizar nova ordenação.
  13. Porque você precisa fazer a junção de tmp com mov se tmp_id_produ_refer existe em mov? select tmp.tmp_id_produ_refer, mov.qt_movim, mov.date_part from tmp_dados as tmp
  14. Você está chamando as funções de dentro do Postgresql ou está usando algum driver? Qual driver? No caso do null também tem que fazer cast: create function f (d date) returns date as $$ select d; $$ language sql; select f(null::date); f --- (1 row)
  15. Na versão 3.x o print é função. Então o argumento é entre parêntesis: print ('US$ %5.2f = R$ %5.2f' % (p, p * d))
  16. Você não precisa de plpgsql na sua função. SQL puro já basta: create function remap_ra(ra float) returns float as $$ select ra - (ra > 180)::integer * 360 $$ language sql;
  17. Float é o apelido de double precision, 8 bytes. Se você quer 4 bytes use real: http://www.postgresql.org/docs/current/sta...pe-numeric.html Para arredondar use round(): select round(-44.9958190917969::numeric, 3); round --------- -44.996 Note que é necessário fazer um cast para numeric. Altere o tipo da coluna em ra para real.
  18. Tem que explicitar os campos que não tem valor default. truncate table alunos restart identity alter table alunos add column status boolean
  19. Você não precisa do IF. Basta v_soma := (v_entrada + vlSalAnt);
  20. Kakao

    Erro Função PL/pgSQL

    Se você usar INTO o select retorna vazio. Retire o INTO e você não precisa de um execute: loop insert into contabilizacoes (ano, mes, entrada, saida, saldo, percentual) values ( dados.ano, dados.mes, dados.entrada, dados.saida, dados.saldo, dados.percentual )
  21. Kakao

    Por favor me ajudem.

    Se for Python 3 tem que ser entre parêntesis: print (4*d, 5*d, 6*d, 7*d, 9*d)
  22. A resposta para a segunda dúvida: SELECT nome_produto FROM produto WHERE categoria IN ( SELECT * from retorna_todas_filhas(5) ) Acredito que resolve a primeira dúvida também (dica: select FROM)
×
×
  • Criar Novo...