Ir para conteúdo
Fórum Script Brasil

Kakao

Membros
  • Total de itens

    463
  • Registro em

  • Última visita

Posts postados por Kakao

  1. 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.

  2. 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.
  3. 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
    
    
  4. 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.

  5. Não entendi a criação desta primary key

    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"

  6. 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

  7. 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
  8. 1. Como "pular" o id_aluno na hora de inserir dados na tabela?

    Tem que explicitar os campos que não tem valor default.

    2. Como consertar esse erro para que ele volte a inserir os dados corretos na tabela, já que ele vai tentar inserir a chave inteira 1 sem sucesso sempre? Ou seja, se uma coluna é auto increment e mesmo assim for setado um valor para ela "na marra", na próxima iteração o SGDB vai querer usar o valor que foi setado na marra e ele vai reclamar. O que fazer?
    truncate table alunos restart identity
    3. Há ainda uma pergunta que não tem nada a ver com a situação acima: como inserir uma coluna "status" como sendo do tipo bit?
    alter table alunos add column status boolean

  9. 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
    )

×
×
  • Criar Novo...