--/* ============== EXTRACTED CEP FROM IBGE CNEFE 2022 ============== CREATE INDEX idx_cnefe_distinct_address ON dados_tipos_corrigidos ("CEP", "NOM_TIPO_SEGLOGR", "NOM_TITULO_SEGLOGR", "NOM_SEGLOGR", "NUM_ENDERECO") WHERE "NUM_ENDERECO" IS NOT NULL AND "CEP" IS NOT NULL; CREATE TABLE public.cnefe2022_ocorrencias_ceps_domicilios AS SELECT "CEP"::TEXT as cep, COUNT(*) AS unique_addresses_count FROM ( SELECT DISTINCT "CEP", "NOM_TIPO_SEGLOGR", "NOM_TITULO_SEGLOGR", "NOM_SEGLOGR", "NUM_ENDERECO" FROM dados_tipos_corrigidos WHERE "NUM_ENDERECO" IS NOT NULL AND "NUM_ENDERECO" != 0 AND "CEP" IS NOT NULL ) AS physical_addresses GROUP BY "CEP" ORDER BY "CEP" ASC, unique_addresses_count DESC; ============== EXTRACTED CEP FROM OSM DATA ============== osmfilter brazil_downloaded_from_geofabrik.osm --keep="addr:postcode and ( addr:street or addr:housenumber )" --drop="highway=" > only_postal_codes_from_osm_brazil.osm --*/ -- Obtain table details SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = 'imported' AND table_name = 'postal_codes_on_osm' ORDER BY ordinal_position; -- Index on the raw cep column CREATE INDEX IF NOT EXISTS idx_cep_unificado_cep ON public.cep_unificado(cep); -- Functional/Expression index on the CRP conversion // This allows PostgreSQL to quickly retrieve the CRP value without re-running the function every time CREATE INDEX IF NOT EXISTS idx_cep_unificado_crp_expr ON public.cep_unificado((crp.from_cep(cep))); -- Imported tables: CREATE SCHEMA IF NOT EXISTS imported; -- - imported.cnefe2022_ocorrencias_ceps_horizontal -- Count the occurrences of each CEP in CNEFE 2022 (IBGE) on distinct house numbers -- - Depreciated: imported.cnefe2022_ocorrencias_ceps_domicilios -- - imported.postal_codes_on_osm -- Count the occurrences of each CEP in OSM dataset (version date: 20260619T202141Z) -- - postal code tags considered: 'addr:postcode' with 'addr:housenumber' or with 'addr:street' but not with 'highway' -- Create extension dblink CREATE EXTENSION IF NOT EXISTS dblink; -- Import jurisdiction to build file name DROP TABLE IF EXISTS imported.jurisdiction; CREATE TABLE IF NOT EXISTS imported.jurisdiction AS SELECT * FROM dblink( 'dbname=dl05s_main', 'SELECT isolabel_ext, osm_id, jurisd_local_id as cod_ibge, name, isolevel FROM optim.jurisdiction WHERE jurisd_base_id = 76' ) AS t ( isolabel_ext character varying, osm_id bigint, cod_ibge integer, "name" character varying, isolevel integer ); -- Update CNEFE table CEP format UPDATE imported.cnefe2022_ocorrencias_ceps_horizontal SET cep = REGEXP_REPLACE(cep, '[^0-9]', '', 'g') WHERE cep ~ '[^0-9]'; -- Update OSM table CEP format UPDATE imported.postal_codes_on_osm SET cep = REGEXP_REPLACE(cep, '[^0-9]', '', 'g') WHERE cep ~ '[^0-9]'; DROP VIEW IF EXISTS public.cep_unificado_plus; CREATE OR REPLACE VIEW public.cep_unificado_plus AS SELECT -- Código de Roteamento Postal crp.from_cep(c.cep) AS crp, -- Original columns from public.cep_unificado c.cep, c.logradouro, c.complemento, c.bairro, c.municipio, c.municipio_cod_ibge, c.uf, c.nome, -- New columns from public.log_num_sec: l.sec_nu_ini, -- house number sequence begin l.sec_nu_fim, -- house number sequence end l.sec_in_lado, -- street side: [A,I,P] = pt:[Ambos,Ímpar,Par] = en:[Both,Odd,Even] -- New columns from imported tables joined by CEP: cnefe.unique_addresses_count AS ocorrencias_cnefe, osm.occurrences AS ocorrencias_osm, -- Identifier from log_logradouro ll.log_nu FROM public.cep_unificado c LEFT JOIN public.log_logradouro ll ON c.cep = ll.cep LEFT JOIN public.log_num_sec l ON ll.log_nu = l.log_nu LEFT JOIN imported.cnefe2022_ocorrencias_ceps_horizontal cnefe ON c.cep = cnefe.cep LEFT JOIN imported.postal_codes_on_osm osm ON c.cep = osm.cep WHERE c.logradouro IS NOT NULL; -- Rows in CNEFE that are not in public.cep_unificado DROP VIEW IF EXISTS public.cep_cnefe_missing_in_unificado; CREATE OR REPLACE VIEW public.cep_cnefe_missing_in_unificado AS SELECT cnefe.* FROM imported.cnefe2022_ocorrencias_ceps_horizontal cnefe WHERE NOT EXISTS ( SELECT 1 FROM public.cep_unificado c WHERE REGEXP_REPLACE(c.cep, '[^0-9]', '', 'g') = cnefe.cep ); -- Rows in OSM that are not in public.cep_unificado DROP VIEW IF EXISTS public.cep_osm_missing_in_unificado; CREATE OR REPLACE VIEW public.cep_osm_missing_in_unificado AS SELECT osm.* FROM imported.postal_codes_on_osm osm WHERE NOT EXISTS ( SELECT 1 FROM public.cep_unificado c WHERE REGEXP_REPLACE(c.cep, '[^0-9]', '', 'g') = osm.cep ); ------------------------------------ CREATE EXTENSION IF NOT EXISTS unaccent; DROP VIEW IF EXISTS public.municipios_normalized; CREATE OR REPLACE VIEW public.municipios_normalized AS SELECT DISTINCT c.municipio_cod_ibge AS municipio_cod_ibge, c.municipio AS municipio, c.uf, -- Transformation of isolabel_ext into normalized_manually lower( regexp_replace( regexp_replace( j.isolabel_ext, '^.*-', '' ), '([a-z0-9])([A-Z])', E'\\1_\\2', 'g' ) ) AS municipio_normalized -- Transformed from isolabel_ext /* regexp_replace( regexp_replace( regexp_replace( regexp_replace( lower(unaccent(c.municipio::TEXT)), '\y(de|da|do|das|dos|e)\y', '', 'g' ), E'd\'|\\-', '_', 'g' ), '[\s'']+', '_', 'g' ), '^_+|_+$|_+', '_', 'g' ) AS municipio_normalized_manually */ FROM public.cep_unificado c LEFT JOIN imported.jurisdiction j ON c.municipio_cod_ibge = j.cod_ibge; DROP VIEW IF EXISTS public.crp_data_github; CREATE OR REPLACE VIEW public.crp_data_github AS SELECT * FROM ( SELECT crp.from_cep(c.cep) AS "CRP", -- Código de Roteamento Postal round( sqrt( COALESCE(cnefe.unique_addresses_count, 0)::INTEGER + COALESCE(osm.occurrences, 0)::INTEGER ) )::TEXT AS idx_confirm, -- idx_confirm=round(sqrt(N)), where N = Sum of occurrences on CNEFE + OSM CASE WHEN cnefe.unique_addresses_count IS NOT NULL AND (osm.osm_source IS NOT NULL AND osm.osm_source <> '') THEN CONCAT_WS(' ', osm.osm_source, 'CNEFE') WHEN cnefe.unique_addresses_count IS NOT NULL THEN 'CNEFE' WHEN osm.osm_source IS NOT NULL AND osm.osm_source <> '' THEN osm.osm_source ELSE NULL END AS idx_ref, m.municipio_normalized AS municipio, c.uf FROM public.cep_unificado c LEFT JOIN public.municipios_normalized m ON c.municipio_cod_ibge = m.municipio_cod_ibge LEFT JOIN imported.cnefe2022_ocorrencias_ceps_horizontal cnefe ON c.cep = cnefe.cep LEFT JOIN imported.postal_codes_on_osm osm ON c.cep = osm.cep ORDER BY "CRP" ASC ) --WHERE idx_confirm <> '0' -- if ignoring no correspondent CEP in the source ; DROP VIEW IF EXISTS public.municipios_normalized; ------------------------------------------------------- -- Peter's code DROP MATERIALIZED VIEW IF EXISTS public.cep_tipologia; CREATE MATERIALIZED VIEW public.cep_tipologia AS SELECT cep5, cep, tipo_cep FROM ( SELECT substring(cep,1,5)::int as cep5, cep, 'LOCALIDADE'::text AS tipo_cep FROM log_localidade WHERE nullif(btrim(cep), '') IS NOT NULL UNION ALL SELECT substring(l.cep,1,5)::int, l.cep, 'LOGRADOURO' || CASE WHEN l.log_complemento ~* '\mlado\M' OR l.log_complemento ~* '\maté\M' OR l.log_complemento ~* '\mde[[:space:]]+[0-9]' OR l.log_complemento ~* '\mao fim\M' THEN '-SECCIONADO_EXPLICITO' WHEN s.log_nu IS NOT NULL THEN '-ABRANGENCIA_NUMERICA' ELSE '-SIMPLES' END FROM log_logradouro l LEFT JOIN log_num_sec s USING (log_nu) WHERE nullif(btrim(l.cep), '') IS NOT NULL UNION ALL SELECT substring(cep,1,5)::int, cep, 'GRANDE_USUARIO' FROM log_grande_usuario WHERE nullif(btrim(cep), '') IS NOT NULL UNION ALL SELECT substring(cep,1,5)::int, cep, 'UNIDADE_OPERACIONAL' FROM log_unid_oper WHERE nullif(btrim(cep), '') IS NOT NULL UNION ALL SELECT substring(cep,1,5)::int, cep, 'CAIXA_POSTAL' FROM log_cpc WHERE nullif(btrim(cep), '') IS NOT NULL ) q; DROP INDEX IF EXISTS public.cep_tipologia_idx1cep; CREATE UNIQUE INDEX cep_tipologia_idx1cep ON public.cep_tipologia(cep); DROP INDEX IF EXISTS public.cep_tipologia_idx1cep; CREATE INDEX cep_tipologia_idx1cep ON public.cep_tipologia(cep5); -- Statistics -- % CREATE or replace VIEW cep_tipologia_tot AS WITH tot AS (SELECT count(*) t FROM cep_tipologia) SELECT tipo_cep, count(*) n, round(100.0*count(*)/tot.t,1)::text||'%' as percent FROM cep_tipologia , tot GROUP BY tipo_cep, tot.t ORDER BY 1 ; --- select * from cep_tipologia_tot; -- Counting SELECT tipo_cep, COUNT(*) n_ceps FROM public.cep_tipologia GROUP BY 1 ORDER BY 1; #TODO em ordem: Grande usuário -> logradouro -> localidade Subir endereços do OSM para banco de dados. rua + cep + numero Usar JOIN do CNEFE e/ou OSM com o tabelão dos ceps, cep_unificado ----------------------- -- FUNCTIONS : BEGIN -- ----------------------- -- Detectar como os tipos de logradouros são abreviados por engenharia reversa WITH base_processada AS ( SELECT trim(tlo_tx) AS tipo_original, log_no, log_no_abrev, -- Pega a string toda menos o tamanho do nome da rua no final trim(substring(log_no_abrev FROM 1 FOR length(log_no_abrev) - length(log_no))) AS sigla_crua FROM public.log_logradouro WHERE tlo_tx IS NOT NULL AND log_no_abrev IS NOT NULL AND log_no IS NOT NULL AND right(log_no_abrev, length(log_no)) = log_no ), base_limpa AS ( SELECT tipo_original, -- 1. unaccent: remove acentos e cedilha (ex: ç -> c) -- 2. regexp_replace: remove espaços, ordinais (ª, º), hífens e qualquer caractere não alfanumérico trim(regexp_replace(unaccent(sigla_crua), '[^a-zA-Z0-9]', '', 'g')) AS sigla_extraida FROM base_processada WHERE sigla_crua <> '' AND sigla_crua <> tipo_original ) SELECT tipo_original, sigla_extraida, COUNT(*) AS freq FROM base_limpa WHERE sigla_extraida <> '' GROUP BY tipo_original, sigla_extraida ORDER BY tipo_original, freq DESC; CREATE EXTENSION IF NOT EXISTS unaccent; -- 1. Função para encolher/abreviar o Tipo de Logradouro conforme os Correios (sem ponto) DROP FUNCTION IF EXISTS endereco_to_camel_correios; DROP FUNCTION IF EXISTS shrink_logradouro_tipo; CREATE OR REPLACE FUNCTION shrink_logradouro_tipo(p_tipo text) RETURNS text LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE BEGIN ATOMIC SELECT CASE lower(unaccent(trim(p_tipo))) -- Todos os distintos tipos de logradouro dos Correios -- ªº WHEN '10ª avenida' THEN '10Av' WHEN '10ª travessa' THEN '10Tv' WHEN '11ª avenida' THEN '11Av' WHEN '11ª travessa' THEN '11Tv' WHEN '12ª rua' THEN '12R' WHEN '12ª travessa' THEN '12Tv' WHEN '13ª travessa' THEN '13Tv' WHEN '14ª travessa' THEN '14Tv' WHEN '15ª travessa' THEN '15Tv' WHEN '16ª travessa' THEN '16Tv' WHEN '17ª travessa' THEN '17Tv' WHEN '18ª travessa' THEN '18Tv' WHEN '19ª travessa' THEN '19Tv' WHEN '1ª avenida' THEN '1Av' WHEN '1ª escadaria' THEN '1Escad' WHEN '1ª ladeira' THEN '1Ld' WHEN '1ª paralela' THEN '1Par' WHEN '1ª rua' THEN '1R' WHEN '1ª subida' THEN '1Sub' WHEN '1ª travessa' THEN '1Tv' WHEN '1ª travessa da avenida' THEN '1TvdaAv' WHEN '1ª travessa da rodovia' THEN '1TvdaRod' WHEN '1ª travessa da rua' THEN '1TvdaR' WHEN '1ª via coletora' THEN '1VColet' WHEN '1ª viela' THEN '1Vla' WHEN '1ª vila' THEN '1Vl' WHEN '1º acesso' THEN '1Ac' WHEN '1º alto' THEN '1At' WHEN '1º beco' THEN '1Bc' WHEN '20ª travessa' THEN '20Tv' WHEN '21ª travessa' THEN '21Tv' WHEN '22ª travessa' THEN '22Tv' WHEN '26ª travessa' THEN '26Tv' WHEN '2ª avenida' THEN '2Av' WHEN '2ª escadaria' THEN '2Escad' WHEN '2ª ladeira' THEN '2Ld' WHEN '2ª paralela' THEN '2Par' WHEN '2ª rua' THEN '2R' WHEN '2ª subida' THEN '2Sub' WHEN '2ª travessa' THEN '2Tv' WHEN '2ª travessa da rodovia' THEN '2TvRod' WHEN '2ª travessa da rua' THEN '2TvdaR' WHEN '2ª via coletora' THEN '2VColet' WHEN '2ª viela' THEN '2Vla' WHEN '2ª vila' THEN '2Vl' WHEN '2º acesso' THEN '2Ac' WHEN '2º alto' THEN '2At' WHEN '2º beco' THEN '2Bc' WHEN '3ª avenida' THEN '3Av' WHEN '3ª escadaria' THEN '3Escad' WHEN '3ª ladeira' THEN '3Ld' WHEN '3ª paralela' THEN '3Par' WHEN '3ª rua' THEN '3R' WHEN '3ª subida' THEN '3Sub' WHEN '3ª travessa' THEN '3Tv' WHEN '3ª travessa da rua' THEN '3TvdaR' WHEN '3ª vila' THEN '3Vl' WHEN '3º acesso' THEN '3Ac' WHEN '3º alto' THEN '3At' WHEN '3º beco' THEN '3Bc' WHEN '4ª avenida' THEN '4Av' WHEN '4ª escadaria' THEN '4Escad' WHEN '4ª paralela' THEN '4Par' WHEN '4ª rua' THEN '4R' WHEN '4ª subida' THEN '4Sub' WHEN '4ª travessa' THEN '4Tv' WHEN '4ª travessa da rua' THEN '4TvdaR' WHEN '4ª vila' THEN '4Vl' WHEN '4º alto' THEN '4At' WHEN '4º beco' THEN '4Bc' WHEN '5ª avenida' THEN '5Av' WHEN '5ª escadaria' THEN '5Escad' WHEN '5ª rua' THEN '5R' WHEN '5ª subida' THEN '5Sub' WHEN '5ª travessa' THEN '5Tv' WHEN '5ª travessa da rua' THEN '5TvdaR' WHEN '5ª vila' THEN '5Vl' WHEN '5º alto' THEN '5At' WHEN '5º beco' THEN '5Bc' WHEN '6ª avenida' THEN '6Av' WHEN '6ª escadaria' THEN '6Escad' WHEN '6ª subida' THEN '6Sub' WHEN '6ª travessa' THEN '6Tv' WHEN '6ª vila' THEN '6Vl' WHEN '6º beco' THEN '6Bc' WHEN '7ª avenida' THEN '7Av' WHEN '7ª escadaria' THEN '7Escad' WHEN '7ª travessa' THEN '7Tv' WHEN '8ª avenida' THEN '8Av' WHEN '8ª escadaria' THEN '8Escad' WHEN '8ª travessa' THEN '8Tv' WHEN '9ª avenida' THEN '9Av' WHEN '9ª rua' THEN '9R' WHEN '9ª travessa' THEN '9Tv' -- WHEN '10a avenida' THEN '10Av' WHEN '10a travessa' THEN '10Tv' WHEN '11a avenida' THEN '11Av' WHEN '11a travessa' THEN '11Tv' WHEN '12a rua' THEN '12R' WHEN '12a travessa' THEN '12Tv' WHEN '13a travessa' THEN '13Tv' WHEN '14a travessa' THEN '14Tv' WHEN '15a travessa' THEN '15Tv' WHEN '16a travessa' THEN '16Tv' WHEN '17a travessa' THEN '17Tv' WHEN '18a travessa' THEN '18Tv' WHEN '19a travessa' THEN '19Tv' WHEN '1a avenida' THEN '1Av' WHEN '1a escadaria' THEN '1Escad' WHEN '1a ladeira' THEN '1Ld' WHEN '1a paralela' THEN '1Par' WHEN '1a rua' THEN '1R' WHEN '1a subida' THEN '1Sub' WHEN '1a travessa' THEN '1Tv' WHEN '1a travessa da avenida' THEN '1TvdaAv' WHEN '1a travessa da rodovia' THEN '1TvdaRod' WHEN '1a travessa da rua' THEN '1TvdaR' WHEN '1a via coletora' THEN '1VColet' WHEN '1a viela' THEN '1Vla' WHEN '1a vila' THEN '1Vl' WHEN '1o acesso' THEN '1Ac' WHEN '1o alto' THEN '1At' WHEN '1o beco' THEN '1Bc' WHEN '20a travessa' THEN '20Tv' WHEN '21a travessa' THEN '21Tv' WHEN '22a travessa' THEN '22Tv' WHEN '26a travessa' THEN '26Tv' WHEN '2a avenida' THEN '2Av' WHEN '2a escadaria' THEN '2Escad' WHEN '2a ladeira' THEN '2Ld' WHEN '2a paralela' THEN '2Par' WHEN '2a rua' THEN '2R' WHEN '2a subida' THEN '2Sub' WHEN '2a travessa' THEN '2Tv' WHEN '2a travessa da rodovia' THEN '2TvRod' WHEN '2a travessa da rua' THEN '2TvdaR' WHEN '2a via coletora' THEN '2VColet' WHEN '2a viela' THEN '2Vla' WHEN '2a vila' THEN '2Vl' WHEN '2o acesso' THEN '2Ac' WHEN '2o alto' THEN '2At' WHEN '2o beco' THEN '2Bc' WHEN '3a avenida' THEN '3Av' WHEN '3a escadaria' THEN '3Escad' WHEN '3a ladeira' THEN '3Ld' WHEN '3a paralela' THEN '3Par' WHEN '3a rua' THEN '3R' WHEN '3a subida' THEN '3Sub' WHEN '3a travessa' THEN '3Tv' WHEN '3a travessa da rua' THEN '3TvdaR' WHEN '3a vila' THEN '3Vl' WHEN '3o acesso' THEN '3Ac' WHEN '3o alto' THEN '3At' WHEN '3o beco' THEN '3Bc' WHEN '4a avenida' THEN '4Av' WHEN '4a escadaria' THEN '4Escad' WHEN '4a paralela' THEN '4Par' WHEN '4a rua' THEN '4R' WHEN '4a subida' THEN '4Sub' WHEN '4a travessa' THEN '4Tv' WHEN '4a travessa da rua' THEN '4TvdaR' WHEN '4a vila' THEN '4Vl' WHEN '4o alto' THEN '4At' WHEN '4o beco' THEN '4Bc' WHEN '5a avenida' THEN '5Av' WHEN '5a escadaria' THEN '5Escad' WHEN '5a rua' THEN '5R' WHEN '5a subida' THEN '5Sub' WHEN '5a travessa' THEN '5Tv' WHEN '5a travessa da rua' THEN '5TvdaR' WHEN '5a vila' THEN '5Vl' WHEN '5o alto' THEN '5At' WHEN '5o beco' THEN '5Bc' WHEN '6a avenida' THEN '6Av' WHEN '6a escadaria' THEN '6Escad' WHEN '6a subida' THEN '6Sub' WHEN '6a travessa' THEN '6Tv' WHEN '6a vila' THEN '6Vl' WHEN '6o beco' THEN '6Bc' WHEN '7a avenida' THEN '7Av' WHEN '7a escadaria' THEN '7Escad' WHEN '7a travessa' THEN '7Tv' WHEN '8a avenida' THEN '8Av' WHEN '8a escadaria' THEN '8Escad' WHEN '8a travessa' THEN '8Tv' WHEN '9a avenida' THEN '9Av' WHEN '9a rua' THEN '9R' WHEN '9a travessa' THEN '9Tv' -- WHEN 'acampamento' THEN 'Acamp' WHEN 'acesso' THEN 'Ac' WHEN 'acesso estadual' THEN 'AcEstd' WHEN 'acesso local' THEN 'AcLoc' WHEN 'acesso para rua' THEN 'AcR' WHEN 'aeroporto' THEN 'Aer' WHEN 'alameda' THEN 'Al' WHEN 'alca de acesso' THEN 'AlcAces' WHEN 'aldeia' THEN 'Ald' WHEN 'aldeia indigena' THEN 'AldInd' WHEN 'alto' THEN 'At' WHEN 'anel' THEN 'An' WHEN 'anel viario' THEN 'AnVr' WHEN 'antiga estacao' THEN 'AntEtc' WHEN 'antiga estrada' THEN 'AntEst' WHEN 'area' THEN 'A' WHEN 'area especial' THEN 'AE' WHEN 'area verde' THEN 'AVerde' WHEN 'arteria' THEN 'Art' WHEN 'atalho' THEN 'Atl' WHEN 'avenida' THEN 'Av' WHEN 'avenida circular' THEN 'AvCirc' WHEN 'avenida contorno' THEN 'AvCont' WHEN 'avenida industrial' THEN 'AvInd' WHEN 'avenida marginal' THEN 'AvMarg' WHEN 'avenida marginal direita' THEN 'AvMargDir' WHEN 'avenida marginal esquerda' THEN 'AvMargEsq' WHEN 'avenida perimetral' THEN 'AvPer' WHEN 'baixa' THEN 'Bx' WHEN 'beco' THEN 'Bc' WHEN 'beco 1' THEN 'Bc1' WHEN 'beco 2' THEN 'Bc2' WHEN 'bloco' THEN 'Bl' WHEN 'blocos' THEN 'Bls' WHEN 'bosque' THEN 'Bsq' WHEN 'boulevard' THEN 'Bvd' WHEN 'bulevar' THEN 'Blv' WHEN 'buraco' THEN 'Bco' WHEN 'cais' THEN 'C' WHEN 'calcada' THEN 'Calc' WHEN 'calcadao' THEN 'Calc' WHEN 'caminho' THEN 'Cam' WHEN 'caminho de servidao' THEN 'CamServ' WHEN 'campo' THEN 'Cpo' WHEN 'canal' THEN 'Can' WHEN 'centro' THEN 'Centr' WHEN 'chacara' THEN 'Ch' WHEN 'ciclovia' THEN 'Cicl' WHEN 'circular' THEN 'Circ' WHEN 'colina' THEN 'Clna' WHEN 'colonia' THEN 'Col' WHEN 'complexo viario' THEN 'CmpVr' WHEN 'comunidade' THEN 'Com' WHEN 'comunidade quilombola' THEN 'ComQuilomb' WHEN 'comunidade rural' THEN 'ComRura' WHEN 'comunidade urbana' THEN 'ComUrba' WHEN 'condominio' THEN 'Cond' WHEN 'condominio residencial' THEN 'CondRes' WHEN 'conjunto' THEN 'Cj' WHEN 'conjunto habitacional' THEN 'CjHab' WHEN 'conjunto residencial' THEN 'CjRes' WHEN 'contorno' THEN 'Cont' WHEN 'corredor' THEN 'Cor' WHEN 'corrego' THEN 'Crg' WHEN 'descida' THEN 'Dsc' WHEN 'desvio' THEN 'Dsv' WHEN 'distrito' THEN 'Dt' WHEN 'edificio' THEN 'Ed' WHEN 'eixo' THEN 'Ex' WHEN 'eixo industrial' THEN 'ExInd' WHEN 'eixo principal' THEN 'ExPrinc' WHEN 'entrada particular' THEN 'EntPart' WHEN 'escada' THEN 'Esc' WHEN 'escada de pedra' THEN 'EscPedra' WHEN 'escadao' THEN 'Esco' WHEN 'escadaria' THEN 'Escad' WHEN 'esplanada' THEN 'Esp' WHEN 'estacao' THEN 'Etc' WHEN 'estacao transformadora' THEN 'EctTrans' WHEN 'estacionamento' THEN 'Estc' WHEN 'estadio' THEN 'Etd' WHEN 'estrada' THEN 'Est' WHEN 'estrada antiga' THEN 'EstAnt' WHEN 'estrada de ferro' THEN 'EstFer' WHEN 'estrada de ligacao' THEN 'EstLig' WHEN 'estrada de servidao' THEN 'EstSrv' WHEN 'estrada ecoturistica' THEN 'EstEcot' WHEN 'estrada estadual' THEN 'EstEstd' WHEN 'estrada federal' THEN 'EstFed' WHEN 'estrada intermunicipal' THEN 'EstInterm' WHEN 'estrada marginal' THEN 'EstMarg' WHEN 'estrada municipal' THEN 'EstMun' WHEN 'estrada nova' THEN 'EstN' WHEN 'estrada para' THEN 'Estpra' WHEN 'estrada particular' THEN 'EstPart' WHEN 'estrada real' THEN 'EstReal' WHEN 'estrada velha' THEN 'EstVelha' WHEN 'estrada vicinal' THEN 'EstVic' WHEN 'estrada vicinal municipal' THEN 'EstVicMun' WHEN 'faixa' THEN 'Fx' WHEN 'favela' THEN 'Fav' WHEN 'fazenda' THEN 'Faz' WHEN 'feira' THEN 'Fra' WHEN 'ferrovia' THEN 'Fer' WHEN 'fonte' THEN 'Fnt' WHEN 'forte' THEN 'Fte' WHEN 'galeria' THEN 'Gal' WHEN 'gleba' THEN 'Glb' WHEN 'granja' THEN 'Gja' WHEN 'ilha' THEN 'Ia' WHEN 'jardim' THEN 'Jd' WHEN 'jardim publico' THEN 'JdPub' WHEN 'jardim residencial' THEN 'JdRes' WHEN 'jardinete' THEN 'Jde' WHEN 'ladeira' THEN 'Ld' WHEN 'lago' THEN 'Lg' WHEN 'lagoa' THEN 'Lga' WHEN 'largo' THEN 'Lrg' WHEN 'ligacao' THEN 'Lig' WHEN 'localidade' THEN 'Loc' WHEN 'loteamento' THEN 'Lot' WHEN 'margem' THEN 'Mrg' WHEN 'marginal' THEN 'Marg' WHEN 'marina' THEN 'Mna' WHEN 'mercado' THEN 'Merc' WHEN 'modulo' THEN 'Mod' WHEN 'monte' THEN 'Mte' WHEN 'morro' THEN 'Mro' WHEN 'nova avenida' THEN 'NAv' WHEN 'nucleo habitacional' THEN 'NucHab' WHEN 'nucleo rural' THEN 'NucRural' WHEN 'ocupacao' THEN 'Ocup' WHEN 'orla fluvial' THEN 'OrFl' WHEN 'parada' THEN 'Pda' WHEN 'paralela' THEN 'Par' WHEN 'parque' THEN 'Prq' WHEN 'parque municipal' THEN 'PrqMunic' WHEN 'parque residencial' THEN 'PrqRes' WHEN 'passagem' THEN 'Psg' WHEN 'passagem de pedestres' THEN 'PsgPed' WHEN 'passagem particular' THEN 'PsgPart' WHEN 'passagem subterranea' THEN 'PsgSub' WHEN 'passarela' THEN 'Psa' WHEN 'passeio' THEN 'Pas' WHEN 'passeio publico' THEN 'PasPub' WHEN 'patio' THEN 'Pat' WHEN 'pedestre' THEN 'Ped' WHEN 'ponta' THEN 'Pta' WHEN 'ponte' THEN 'Pte' WHEN 'porto' THEN 'Pto' WHEN 'povoado' THEN 'Pov' WHEN 'praca' THEN 'Pc' WHEN 'praca de esportes' THEN 'PcEsp' WHEN 'praia' THEN 'Pr' WHEN 'prolongamento' THEN 'Prl' WHEN 'prolongamento da avenida' THEN 'PrlAv' WHEN 'prolongamento da rua' THEN 'PrlR' WHEN 'quadra' THEN 'Q' WHEN 'ramal' THEN 'Ram' WHEN 'rampa' THEN 'Rmp' WHEN 'recanto' THEN 'Rec' WHEN 'residencial' THEN 'Res' WHEN 'reta' THEN 'Ret' WHEN 'retorno' THEN 'Rtn' WHEN 'rodo anel' THEN 'RodAn' WHEN 'rodovia' THEN 'Rod' WHEN 'rodovia de acesso' THEN 'RodAc' WHEN 'rodovia estadual' THEN 'RodEstd' WHEN 'rodovia municipal' THEN 'RodMun' WHEN 'rodovia vicinal' THEN 'RodVic' WHEN 'rotatoria' THEN 'Rtt' WHEN 'rotula' THEN 'Rot' WHEN 'rua' THEN 'R' WHEN 'rua circular' THEN 'RCirc' WHEN 'rua contorno' THEN 'RCont' WHEN 'rua de ligacao' THEN 'RLig' WHEN 'rua de pedestre' THEN 'RPed' WHEN 'rua ferroviaria' THEN 'RFerr' WHEN 'rua integracao' THEN 'RInteg' WHEN 'rua particular' THEN 'RPart' WHEN 'rua principal' THEN 'RPrinc' WHEN 'rua projetada' THEN 'RProj' WHEN 'rua velha' THEN 'RVelha' WHEN 'rua vicinal' THEN 'RVic' WHEN 'ruela' THEN 'Rla' WHEN 'segunda avenida' THEN 'SegAv' WHEN 'semi anel viario' THEN 'SAnV' WHEN 'servidao' THEN 'Srv' WHEN 'servidao de passagem' THEN 'SrvPsg' WHEN 'setor' THEN 'St' WHEN 'sitio' THEN 'Sit' WHEN 'subida' THEN 'Sub' WHEN 'temporario' THEN 'Temp' WHEN 'terceira avenida' THEN 'TercAv' WHEN 'terminal' THEN 'Ter' WHEN 'tifa' THEN 'Tf' WHEN 'transversal' THEN 'Transv' WHEN 'travessa' THEN 'Tv' WHEN 'travessa da rua' THEN 'TvdaRua' WHEN 'travessa particular' THEN 'TvPart' WHEN 'travessa projetada' THEN 'TvProj' WHEN 'travessa velha' THEN 'TvVelha' WHEN 'travessia' THEN 'Travess' WHEN 'trecho' THEN 'Tr' WHEN 'trevo' THEN 'Trv' WHEN 'trilha' THEN 'Tl' WHEN 'tunel' THEN 'Tun' WHEN 'unidade' THEN 'Unid' WHEN 'vala' THEN 'Val' WHEN 'vale' THEN 'Vle' WHEN 'variante' THEN 'Vrte' WHEN 'variante da estrada' THEN 'VrteEst' WHEN 'vereda' THEN 'Ver' WHEN 'via' THEN 'V' WHEN 'via coletora' THEN 'VColet' WHEN 'via de acesso' THEN 'VAc' WHEN 'via de circulacao' THEN 'VCirc' WHEN 'via de pedestre' THEN 'VPed' WHEN 'via de pedestres' THEN 'VPeds' WHEN 'via diretriz' THEN 'VlDir' WHEN 'viaduto' THEN 'Vd' WHEN 'via estrada municipal' THEN 'VEstMun' WHEN 'via expressa' THEN 'VExp' WHEN 'via lateral' THEN 'VLat' WHEN 'via litoranea' THEN 'VLit' WHEN 'via local' THEN 'VLocal' WHEN 'via marginal' THEN 'VMarg' WHEN 'via municipal' THEN 'VMun' WHEN 'via pedestre' THEN 'Vped' WHEN 'via principal' THEN 'VPrinc' WHEN 'vicinal' THEN 'Vc' WHEN 'viela' THEN 'Vla' WHEN 'viela da rua' THEN 'VladaR' WHEN 'viela de acesso' THEN 'VladeAc' WHEN 'vila' THEN 'Vl' WHEN 'zigue-zague' THEN 'ZigZag' -- If no match... ELSE NULL --initcap(lower(unaccent(p_tipo))) END; END; -- 2. Função para encolher/abreviar Títulos conforme os Correios (sem ponto) DROP FUNCTION IF EXISTS shrink_logradouro_titulo; CREATE OR REPLACE FUNCTION shrink_logradouro_titulo(p_titulo text) RETURNS text LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE BEGIN ATOMIC SELECT CASE lower(unaccent(trim(p_titulo))) -- Títulos e patentes comuns WHEN 'doutor' THEN 'Dr' WHEN 'doutora' THEN 'Dra' WHEN 'coronel' THEN 'Cel' WHEN 'general' THEN 'Gen' WHEN 'major' THEN 'Maj' WHEN 'capitao' THEN 'Cap' WHEN 'tenente' THEN 'Ten' WHEN 'subtenente' THEN 'Sgt' -- ou mantido WHEN 'sargento' THEN 'Sgt' WHEN 'professor' THEN 'Prof' WHEN 'professora' THEN 'Profa' WHEN 'padre' THEN 'Pe' WHEN 'frei' THEN 'Frei' WHEN 'pastor' THEN 'Pr' WHEN 'engenheiro' THEN 'Eng' WHEN 'engenheira' THEN 'Enga' WHEN 'vice prefeito' THEN 'VicePref' -- Lista de títulos do CNEFE a ser trabalhada WHEN 'abade' THEN 'Abade' WHEN 'abadessa' THEN 'Abadessa' WHEN 'abolicionista' THEN 'Abolicionista' WHEN 'academica' THEN 'Academica' WHEN 'academico' THEN 'Academico' WHEN 'administrador' THEN 'Administrador' WHEN 'administradora' THEN 'Administradora' WHEN 'admonitor' THEN 'Admonitor' WHEN 'advogada' THEN 'Advogada' WHEN 'advogado' THEN 'Advogado' WHEN 'advogado doutor' THEN 'AdvogadoDoutor' WHEN 'aeronauta' THEN 'Aeronauta' WHEN 'agente' THEN 'Agente' WHEN 'agente fiscal' THEN 'AgenteFiscal' WHEN 'agente postal' THEN 'AgentePostal' WHEN 'agricultor' THEN 'Agricultor' WHEN 'agricultora' THEN 'Agricultora' WHEN 'agrimensor' THEN 'Agrimensor' WHEN 'agronomo' THEN 'Agronomo' WHEN 'agropecuarista' THEN 'Agropecuarista' WHEN 'ajudante' THEN 'Ajudante' WHEN 'alcaide' THEN 'Alcaide' WHEN 'alcaidessa' THEN 'Alcaidessa' WHEN 'alfaiate' THEN 'Alfaiate' WHEN 'alfaqui' THEN 'Alfaqui' WHEN 'alferes' THEN 'Alferes' WHEN 'almirante' THEN 'Almirante' WHEN 'almocreve' THEN 'Almocreve' WHEN 'aluna' THEN 'Aluna' WHEN 'aluno' THEN 'Aluno' WHEN 'ancia' THEN 'Ancia' WHEN 'anciao' THEN 'Anciao' WHEN 'anjo' THEN 'Anjo' WHEN 'antiste' THEN 'Antiste' WHEN 'antropologo' THEN 'Antropologo' WHEN 'aposentada' THEN 'Aposentada' WHEN 'aposentado' THEN 'Aposentado' WHEN 'apostolo' THEN 'Apostolo' WHEN 'apresentador' THEN 'Apresentador' WHEN 'arabi' THEN 'Arabi' WHEN 'arcanjo' THEN 'Arcanjo' WHEN 'arcebispo' THEN 'Arcebispo' WHEN 'arcebispo dom' THEN 'ArcebispoDom' WHEN 'arcipreste' THEN 'Arcipreste' WHEN 'arquiteta' THEN 'Arquiteta' WHEN 'arquiteto' THEN 'Arquiteto' WHEN 'artesao' THEN 'Artesao' WHEN 'artifice' THEN 'Artifice' WHEN 'artista' THEN 'Artista' WHEN 'artista plastico' THEN 'ArtistaPlastico' WHEN 'aspirante' THEN 'Aspirante' WHEN 'assessor' THEN 'Assessor' WHEN 'assessora' THEN 'Assessora' WHEN 'assistente social' THEN 'AssistenteSocial' WHEN 'astronomo' THEN 'Astronomo' WHEN 'atleta' THEN 'Atleta' WHEN 'ator' THEN 'Ator' WHEN 'atriz' THEN 'Atriz' WHEN 'aviador' THEN 'Aviador' WHEN 'aviadora' THEN 'Aviadora' WHEN 'avo' THEN 'Avo' WHEN 'bacharel' THEN 'Bacharel' WHEN 'balconista' THEN 'Balconista' WHEN 'bancaria' THEN 'Bancaria' WHEN 'bancario' THEN 'Bancario' WHEN 'bandeirante' THEN 'Bandeirante' WHEN 'bandeirantes' THEN 'Bandeirantes' WHEN 'barao' THEN 'Barao' WHEN 'baronesa' THEN 'Baronesa' WHEN 'beata' THEN 'Beata' WHEN 'beata madre' THEN 'BeataMadre' WHEN 'beato' THEN 'Beato' WHEN 'benemerito' THEN 'Benemerito' WHEN 'benfeitor' THEN 'Benfeitor' WHEN 'bispo' THEN 'Bispo' WHEN 'bispo dom' THEN 'BispoDom' WHEN 'bombeiro' THEN 'Bombeiro' WHEN 'bonzo' THEN 'Bonzo' WHEN 'boto' THEN 'Boto' WHEN 'brigadeiro' THEN 'Brigadeiro' WHEN 'cabo' THEN 'Cabo' WHEN 'cabocla' THEN 'Cabocla' WHEN 'caboclo' THEN 'Caboclo' WHEN 'cabo policia militar' THEN 'CaboPoliciaMilitar' WHEN 'cacador' THEN 'Cacador' WHEN 'cacique' THEN 'Cacique' WHEN 'cadete' THEN 'Cadete' WHEN 'camarista' THEN 'Camarista' WHEN 'caminhoneiro' THEN 'Caminhoneiro' WHEN 'canonisa' THEN 'Canonisa' WHEN 'cantor' THEN 'Cantor' WHEN 'cantora' THEN 'Cantora' WHEN 'capataz' THEN 'Capataz' WHEN 'capelao' THEN 'Capelao' WHEN 'capitao' THEN 'Capitao' WHEN 'capitao aviador' THEN 'CapitaoAviador' WHEN 'capitao doutor' THEN 'CapitaoDoutor' WHEN 'capitao mor' THEN 'CapitaoMor' WHEN 'capitao policia militar' THEN 'CapitaoPoliciaMilitar' WHEN 'capitao tenente' THEN 'CapitaoTenente' WHEN 'carcereiro' THEN 'Carcereiro' WHEN 'cardeal' THEN 'Cardeal' WHEN 'cardeal dom' THEN 'CardealDom' WHEN 'carmelita' THEN 'Carmelita' WHEN 'carnavalesco' THEN 'Carnavalesco' WHEN 'carpinteiro' THEN 'Carpinteiro' WHEN 'carreteiro' THEN 'Carreteiro' WHEN 'carteiro' THEN 'Carteiro' WHEN 'cartunista' THEN 'Cartunista' WHEN 'catequista' THEN 'Catequista' WHEN 'cavalheiro' THEN 'Cavalheiro' WHEN 'centenario' THEN 'Centenario' WHEN 'ceramista' THEN 'Ceramista' WHEN 'chanceler' THEN 'Chanceler' WHEN 'chefe' THEN 'Chefe' WHEN 'cidadao' THEN 'Cidadao' WHEN 'cientista' THEN 'Cientista' WHEN 'cineasta' THEN 'Cineasta' WHEN 'cirurgiao' THEN 'Cirurgiao' WHEN 'coletor' THEN 'Coletor' WHEN 'colonizador' THEN 'Colonizador' WHEN 'colunista' THEN 'Colunista' WHEN 'comadre' THEN 'Comadre' WHEN 'comandante' THEN 'Comandante' WHEN 'combatente' THEN 'Combatente' WHEN 'comediante' THEN 'Comediante' WHEN 'comendadeira' THEN 'Comendadeira' WHEN 'comendador' THEN 'Comendador' WHEN 'comendador capitao' THEN 'ComendadorCapitao' WHEN 'comendador doutor' THEN 'ComendadorDoutor' WHEN 'comerciante' THEN 'Comerciante' WHEN 'comerciaria' THEN 'Comerciaria' WHEN 'comerciario' THEN 'Comerciario' WHEN 'comissaria' THEN 'Comissaria' WHEN 'comissario' THEN 'Comissario' WHEN 'comodoro' THEN 'Comodoro' WHEN 'compositor' THEN 'Compositor' WHEN 'comunitaria' THEN 'Comunitaria' WHEN 'comunitario' THEN 'Comunitario' WHEN 'conde' THEN 'Conde' WHEN 'condessa' THEN 'Condessa' WHEN 'conego' THEN 'Conego' WHEN 'confrade' THEN 'Confrade' WHEN 'conselheira' THEN 'Conselheira' WHEN 'conselheiro' THEN 'Conselheiro' WHEN 'conselheiro doutor' THEN 'ConselheiroDoutor' WHEN 'construtor' THEN 'Construtor' WHEN 'consul' THEN 'Consul' WHEN 'consulesa' THEN 'Consulesa' WHEN 'consultora' THEN 'Consultora' WHEN 'contabilista' THEN 'Contabilista' WHEN 'contador' THEN 'Contador' WHEN 'contadora' THEN 'Contadora' WHEN 'contra almirante' THEN 'ContraAlmirante' WHEN 'corneteiro' THEN 'Corneteiro' WHEN 'coronel' THEN 'Coronel' WHEN 'coronel aviador' THEN 'CoronelAviador' WHEN 'coronel pm' THEN 'CoronelPm' WHEN 'corredor' THEN 'Corredor' WHEN 'corretor' THEN 'Corretor' WHEN 'corretora' THEN 'Corretora' WHEN 'costureira' THEN 'Costureira' WHEN 'cronista' THEN 'Cronista' WHEN 'cunhada' THEN 'Cunhada' WHEN 'cunhado' THEN 'Cunhado' WHEN 'cura' THEN 'Cura' WHEN 'czar' THEN 'Czar' WHEN 'czarina' THEN 'Czarina' WHEN 'deao' THEN 'Deao' WHEN 'defensor publico' THEN 'DefensorPublico' WHEN 'delegada' THEN 'Delegada' WHEN 'delegado' THEN 'Delegado' WHEN 'dentista' THEN 'Dentista' WHEN 'deputada' THEN 'Deputada' WHEN 'deputado' THEN 'Deputado' WHEN 'deputado federal' THEN 'DeputadoFederal' WHEN 'desbravador' THEN 'Desbravador' WHEN 'desembargador' THEN 'Desembargador' WHEN 'desembargadora' THEN 'Desembargadora' WHEN 'desembargador doutor' THEN 'DesembargadorDoutor' WHEN 'desenhista' THEN 'Desenhista' WHEN 'despachante' THEN 'Despachante' WHEN 'desportista' THEN 'Desportista' WHEN 'detetive' THEN 'Detetive' WHEN 'diaconisa' THEN 'Diaconisa' WHEN 'diacono' THEN 'Diacono' WHEN 'dicionarista' THEN 'Dicionarista' WHEN 'diplomata' THEN 'Diplomata' WHEN 'diretor' THEN 'Diretor' WHEN 'diretora' THEN 'Diretora' WHEN 'doge' THEN 'Doge' WHEN 'dogesa' THEN 'Dogesa' WHEN 'dom' THEN 'Dom' WHEN 'domestica' THEN 'Domestica' WHEN 'dominicano' THEN 'Dominicano' WHEN 'dona' THEN 'Dona' WHEN 'dona sinha' THEN 'DonaSinha' WHEN 'doutor' THEN 'Doutor' WHEN 'doutora' THEN 'Doutora' WHEN 'doutor professor' THEN 'DoutorProfessor' WHEN 'druida' THEN 'Druida' WHEN 'druidisa' THEN 'Druidisa' WHEN 'duque' THEN 'Duque' WHEN 'duquesa' THEN 'Duquesa' WHEN 'ecologista' THEN 'Ecologista' WHEN 'economista' THEN 'Economista' WHEN 'educador' THEN 'Educador' WHEN 'educadora' THEN 'Educadora' WHEN 'eletricista' THEN 'Eletricista' WHEN 'emancipador' THEN 'Emancipador' WHEN 'embaixador' THEN 'Embaixador' WHEN 'embaixatriz' THEN 'Embaixatriz' WHEN 'empresario' THEN 'Empresario' WHEN 'enfermeira' THEN 'Enfermeira' WHEN 'enfermeiro' THEN 'Enfermeiro' WHEN 'engenheira' THEN 'Engenheira' WHEN 'engenheiro' THEN 'Engenheiro' WHEN 'engenheiro agronomo' THEN 'EngenheiroAgronomo' WHEN 'engenheiro quimico' THEN 'EngenheiroQuimico' WHEN 'escoteiro' THEN 'Escoteiro' WHEN 'escrava' THEN 'Escrava' WHEN 'escravo' THEN 'Escravo' WHEN 'escrevente' THEN 'Escrevente' WHEN 'escritor' THEN 'Escritor' WHEN 'escritora' THEN 'Escritora' WHEN 'escriva' THEN 'Escriva' WHEN 'escrivao' THEN 'Escrivao' WHEN 'escultor' THEN 'Escultor' WHEN 'escultora' THEN 'Escultora' WHEN 'esportista' THEN 'Esportista' WHEN 'estivador' THEN 'Estivador' WHEN 'estudante' THEN 'Estudante' WHEN 'evangelica' THEN 'Evangelica' WHEN 'evangelico' THEN 'Evangelico' WHEN 'evangelista' THEN 'Evangelista' WHEN 'evangelizador' THEN 'Evangelizador' WHEN 'ex combatente' THEN 'ExCombatente' WHEN 'expedicionario' THEN 'Expedicionario' WHEN 'expedicionario cabo' THEN 'ExpedicionarioCabo' WHEN 'expedicionarios' THEN 'Expedicionarios' WHEN 'ex prefeito' THEN 'ExPrefeito' WHEN 'farmaceutica' THEN 'Farmaceutica' WHEN 'farmaceutico' THEN 'Farmaceutico' WHEN 'feirante' THEN 'Feirante' WHEN 'ferroviaria' THEN 'Ferroviaria' WHEN 'ferroviario' THEN 'Ferroviario' WHEN 'filantropo' THEN 'Filantropo' WHEN 'filha' THEN 'Filha' WHEN 'filhas' THEN 'Filhas' WHEN 'filho' THEN 'Filho' WHEN 'filhos' THEN 'Filhos' WHEN 'filosofo' THEN 'Filosofo' WHEN 'fiscal' THEN 'Fiscal' WHEN 'fisico' THEN 'Fisico' WHEN 'folclorista' THEN 'Folclorista' WHEN 'fotografa' THEN 'Fotografa' WHEN 'fotografo' THEN 'Fotografo' WHEN 'fotografo jornalistico' THEN 'FotografoJornalistico' WHEN 'frade' THEN 'Frade' WHEN 'frei' THEN 'Frei' WHEN 'freira' THEN 'Freira' WHEN 'freire' THEN 'Freire' WHEN 'frei sao' THEN 'FreiSao' WHEN 'funcionaria' THEN 'Funcionaria' WHEN 'funcionaria publica' THEN 'FuncionariaPublica' WHEN 'funcionario' THEN 'Funcionario' WHEN 'funcionario publico' THEN 'FuncionarioPublico' WHEN 'fundador' THEN 'Fundador' WHEN 'furriel' THEN 'Furriel' WHEN 'garcon' THEN 'Garcon' WHEN 'general' THEN 'General' WHEN 'general de divisao' THEN 'GeneralDivisao' WHEN 'general de exercito' THEN 'GeneralExercito' WHEN 'generalissimo' THEN 'Generalissimo' WHEN 'geografo' THEN 'Geografo' WHEN 'governador' THEN 'Governador' WHEN 'governadora' THEN 'Governadora' WHEN 'grafico' THEN 'Grafico' WHEN 'grao' THEN 'Grao' WHEN 'grao mestre' THEN 'GraoMestre' WHEN 'grumete' THEN 'Grumete' WHEN 'guarda' THEN 'Guarda' WHEN 'guarda civil' THEN 'GuardaCivil' WHEN 'guarda marinha' THEN 'GuardaMarinha' WHEN 'guarda mor' THEN 'GuardaMor' WHEN 'guarda municipal' THEN 'GuardaMunicipal' WHEN 'guarda territorial' THEN 'GuardaTerritorial' WHEN 'guerreiro' THEN 'Guerreiro' WHEN 'guia' THEN 'Guia' WHEN 'heroina' THEN 'Heroina' WHEN 'historiador' THEN 'Historiador' WHEN 'historiadora' THEN 'Historiadora' WHEN 'imaculada' THEN 'Imaculada' WHEN 'imaculado' THEN 'Imaculado' WHEN 'imigrante' THEN 'Imigrante' WHEN 'imigrantes' THEN 'Imigrantes' WHEN 'imperador' THEN 'Imperador' WHEN 'imperador dom' THEN 'ImperadorDom' WHEN 'imperatriz' THEN 'Imperatriz' WHEN 'imperatriz dona' THEN 'ImperatrizDona' WHEN 'india' THEN 'India' WHEN 'indio' THEN 'Indio' WHEN 'industrial' THEN 'Industrial' WHEN 'industriario' THEN 'Industriario' WHEN 'infante' THEN 'Infante' WHEN 'infante dom' THEN 'InfanteDom' WHEN 'inspetor' THEN 'Inspetor' WHEN 'inspetora' THEN 'Inspetora' WHEN 'intendente' THEN 'Intendente' WHEN 'intendente doutor' THEN 'IntendenteDoutor' WHEN 'interventor' THEN 'Interventor' WHEN 'investigador' THEN 'Investigador' WHEN 'investigador de policia' THEN 'InvestigadorPolicia' WHEN 'irma' THEN 'Irma' WHEN 'irmao' THEN 'Irmao' WHEN 'irmaos' THEN 'Irmaos' WHEN 'irmas' THEN 'Irmas' WHEN 'jangadeiro' THEN 'Jangadeiro' WHEN 'jardineira' THEN 'Jardineira' WHEN 'jardineiro' THEN 'Jardineiro' WHEN 'jesuita' THEN 'Jesuita' WHEN 'jornalista' THEN 'Jornalista' WHEN 'jovem' THEN 'Jovem' WHEN 'juiz' THEN 'Juiz' WHEN 'juiza' THEN 'Juiza' WHEN 'juiz de direito' THEN 'JuizDireito' WHEN 'juiz de paz' THEN 'JuizPaz' WHEN 'junior' THEN 'Junior' WHEN 'jurista' THEN 'Jurista' WHEN 'laboratorista' THEN 'Laboratorista' WHEN 'lavrador' THEN 'Lavrador' WHEN 'legionario' THEN 'Legionario' WHEN 'leiloeiro' THEN 'Leiloeiro' WHEN 'libertador' THEN 'Libertador' WHEN 'lider comunitario' THEN 'LiderComunitario' WHEN 'livreiro' THEN 'Livreiro' WHEN 'locutor' THEN 'Locutor' WHEN 'locutora' THEN 'Locutora' WHEN 'lord' THEN 'Lord' WHEN 'lorde' THEN 'Lorde' WHEN 'madame' THEN 'Madame' WHEN 'madre' THEN 'Madre' WHEN 'madrinha' THEN 'Madrinha' WHEN 'madrinheiro' THEN 'Madrinheiro' WHEN 'mae' THEN 'Mae' WHEN 'maestrina' THEN 'Maestrina' WHEN 'maestro' THEN 'Maestro' WHEN 'maestro reverendo' THEN 'MaestroReverendo' WHEN 'magistrado' THEN 'Magistrado' WHEN 'major' THEN 'Major' WHEN 'major aviador' THEN 'MajorAviador' WHEN 'major brigadeiro' THEN 'MajorBrigadeiro' WHEN 'major brigadeiro do ar' THEN 'MajorBrigadeiroAr' WHEN 'major de exercito' THEN 'MajorExercito' WHEN 'major doutor' THEN 'MajorDoutor' WHEN 'major policia militar' THEN 'MajorPoliciaMilitar' WHEN 'maquinista' THEN 'Maquinista' WHEN 'maraja' THEN 'Maraja' WHEN 'marceneiro' THEN 'Marceneiro' WHEN 'marchante' THEN 'Marchante' WHEN 'marechal' THEN 'Marechal' WHEN 'marechal do ar' THEN 'MarechalAr' WHEN 'marinheiro' THEN 'Marinheiro' WHEN 'maritimo' THEN 'Maritimo' WHEN 'marques' THEN 'Marques' WHEN 'marquesa' THEN 'Marquesa' WHEN 'marujo' THEN 'Marujo' WHEN 'mecanico' THEN 'Mecanico' WHEN 'medica' THEN 'Medica' WHEN 'medico' THEN 'Medico' WHEN 'medico industrial' THEN 'MedicoIndustrial' WHEN 'medium' THEN 'Medium' WHEN 'menina' THEN 'Menina' WHEN 'menino' THEN 'Menino' WHEN 'mensageiro' THEN 'Mensageiro' WHEN 'mestra' THEN 'Mestra' WHEN 'mestre' THEN 'Mestre' WHEN 'metalurgico' THEN 'Metalurgico' WHEN 'militar' THEN 'Militar' WHEN 'ministra' THEN 'Ministra' WHEN 'ministro' THEN 'Ministro' WHEN 'miss' THEN 'Miss' WHEN 'missionaria' THEN 'Missionaria' WHEN 'missionario' THEN 'Missionario' WHEN 'mister' THEN 'Mister' WHEN 'monge' THEN 'Monge' WHEN 'monsenhor' THEN 'Monsenhor' WHEN 'monsieur' THEN 'Monsieur' WHEN 'motorista' THEN 'Motorista' WHEN 'musicista' THEN 'Musicista' WHEN 'musico' THEN 'Musico' WHEN 'naturalista' THEN 'Naturalista' WHEN 'navegador' THEN 'Navegador' WHEN 'neta' THEN 'Neta' WHEN 'neto' THEN 'Neto' WHEN 'nono' THEN 'Nono' WHEN 'nora' THEN 'Nora' WHEN 'nossa' THEN 'Nossa' WHEN 'nossa senhora' THEN 'NossaSenhora' WHEN 'nossa senhora imaculada' THEN 'NossaSenhoraImaculada' WHEN 'nosso' THEN 'Nosso' WHEN 'nosso senhor' THEN 'NossoSenhor' WHEN 'nuncio' THEN 'Nuncio' WHEN 'oficial' THEN 'Oficial' WHEN 'oficial de justica' THEN 'OficialJustica' WHEN 'operaria' THEN 'Operaria' WHEN 'operario' THEN 'Operario' WHEN 'orador' THEN 'Orador' WHEN 'organista' THEN 'Organista' WHEN 'ouvidor' THEN 'Ouvidor' WHEN 'padre' THEN 'Padre' WHEN 'padre conego' THEN 'PadreConego' WHEN 'padre dom' THEN 'PadreDom' WHEN 'padres' THEN 'Padres' WHEN 'padre santo' THEN 'PadreSanto' WHEN 'padroeiro' THEN 'Padroeiro' WHEN 'pai' THEN 'Pai' WHEN 'paisagista' THEN 'Paisagista' WHEN 'papa' THEN 'Papa' WHEN 'papa santo' THEN 'PapaSanto' WHEN 'papa sao' THEN 'PapaSao' WHEN 'paroco' THEN 'Paroco' WHEN 'parteira' THEN 'Parteira' WHEN 'parteira mae' THEN 'ParteiraMae' WHEN 'pastor' THEN 'Pastor' WHEN 'pastora' THEN 'Pastora' WHEN 'patriarca' THEN 'Patriarca' WHEN 'patrulheiro' THEN 'Patrulheiro' WHEN 'pedestre' THEN 'Pedestre' WHEN 'pedreiro' THEN 'Pedreiro' WHEN 'perito' THEN 'Perito' WHEN 'pescador' THEN 'Pescador' WHEN 'pescadora' THEN 'Pescadora' WHEN 'pianista' THEN 'Pianista' WHEN 'piloto' THEN 'Piloto' WHEN 'pintor' THEN 'Pintor' WHEN 'pintora' THEN 'Pintora' WHEN 'pio' THEN 'Pio' WHEN 'pioneira' THEN 'Pioneira' WHEN 'pioneiro' THEN 'Pioneiro' WHEN 'poceiro' THEN 'Poceiro' WHEN 'poeta' THEN 'Poeta' WHEN 'poetisa' THEN 'Poetisa' WHEN 'policial' THEN 'Policial' WHEN 'policial militar' THEN 'PolicialMilitar' WHEN 'portuario' THEN 'Portuario' WHEN 'praca' THEN 'Praca' WHEN 'pracinha' THEN 'Pracinha' WHEN 'prefeita' THEN 'Prefeita' WHEN 'prefeito' THEN 'Prefeito' WHEN 'prefeito coronel' THEN 'PrefeitoCoronel' WHEN 'prefeito doutor' THEN 'PrefeitoDoutor' WHEN 'presbitero' THEN 'Presbitero' WHEN 'presidenta' THEN 'Presidenta' WHEN 'presidente' THEN 'Presidente' WHEN 'presidente barao' THEN 'PresidenteBarao' WHEN 'presidente doutor' THEN 'PresidenteDoutor' WHEN 'presidente general' THEN 'PresidenteGeneral' WHEN 'presidente marechal' THEN 'PresidenteMarechal' WHEN 'prima' THEN 'Prima' WHEN 'primeiro ministro' THEN 'PrimeiroMinistro' WHEN 'primeiro sargento' THEN 'PrimeiroSargento' WHEN 'primeiro sargento pm' THEN 'PrimeiroSargentoPm' WHEN 'primeiro tenente' THEN 'PrimeiroTenente' WHEN 'primeiro tenente aviador' THEN 'PrimeiroTenenteAviador' WHEN 'primo' THEN 'Primo' WHEN 'princesa' THEN 'Princesa' WHEN 'princesa dona' THEN 'PrincesaDona' WHEN 'principe' THEN 'Principe' WHEN 'principe dom' THEN 'PrincipeDom' WHEN 'prior' THEN 'Prior' WHEN 'procurador' THEN 'Procurador' WHEN 'procuradora' THEN 'Procuradora' WHEN 'professor' THEN 'Professor' WHEN 'professora' THEN 'Professora' WHEN 'professora dona' THEN 'ProfessoraDona' WHEN 'professora doutora' THEN 'ProfessoraDoutora' WHEN 'professor doutor' THEN 'ProfessorDoutor' WHEN 'professor engenheiro' THEN 'ProfessorEngenheiro' WHEN 'professor irmao' THEN 'ProfessorIrmao' WHEN 'professor padre' THEN 'ProfessorPadre' WHEN 'profeta' THEN 'Profeta' WHEN 'profetisa' THEN 'Profetisa' WHEN 'promotor' THEN 'Promotor' WHEN 'promotora' THEN 'Promotora' WHEN 'provedor' THEN 'Provedor' WHEN 'psicologa' THEN 'Psicologa' WHEN 'publicitario' THEN 'Publicitario' WHEN 'quimica' THEN 'Quimica' WHEN 'quimico' THEN 'Quimico' WHEN 'rabi' THEN 'Rabi' WHEN 'rabino' THEN 'Rabino' WHEN 'radialista' THEN 'Radialista' WHEN 'radiotelegrafista' THEN 'Radiotelegrafista' WHEN 'rainha' THEN 'Rainha' WHEN 'raja' THEN 'Raja' WHEN 'regente' THEN 'Regente' WHEN 'rei' THEN 'Rei' WHEN 'reitor' THEN 'Reitor' WHEN 'reitora' THEN 'Reitora' WHEN 'remador' THEN 'Remador' WHEN 'reporter' THEN 'Reporter' WHEN 'reverendissimo' THEN 'Reverendissimo' WHEN 'reverendo' THEN 'Reverendo' WHEN 'reverendo doutor' THEN 'ReverendoDoutor' WHEN 'reverendo professor' THEN 'ReverendoProfessor' WHEN 'sacerdote' THEN 'Sacerdote' WHEN 'sacerdotisa' THEN 'Sacerdotisa' WHEN 'sacristao' THEN 'Sacristao' WHEN 'sagrada' THEN 'Sagrada' WHEN 'sagrado' THEN 'Sagrado' WHEN 'saint' THEN 'Saint' WHEN 'san' THEN 'San' WHEN 'sanfoneiro' THEN 'Sanfoneiro' WHEN 'santa' THEN 'Santa' WHEN 'santa madre' THEN 'SantaMadre' WHEN 'santissima' THEN 'Santissima' WHEN 'santo' THEN 'Santo' WHEN 'santos' THEN 'Santos' WHEN 'sao' THEN 'Sao' WHEN 'sapateiro' THEN 'Sapateiro' WHEN 'sargento' THEN 'Sargento' WHEN 'sargento aviador' THEN 'SargentoAviador' WHEN 'sargento da aeronautica' THEN 'SargentoAeronautica' WHEN 'sargento expedicionario' THEN 'SargentoExpedicionario' WHEN 'sargento mor' THEN 'SargentoMor' WHEN 'sargento policia militar' THEN 'SargentoPoliciaMilitar' WHEN 'secretaria' THEN 'Secretaria' WHEN 'secretario' THEN 'Secretario' WHEN 'segundo sargento' THEN 'SegundoSargento' WHEN 'segundo tenente' THEN 'SegundoTenente' WHEN 'segundo tenente aviador' THEN 'SegundoTenenteAviador' WHEN 'seminarista' THEN 'Seminarista' WHEN 'senador' THEN 'Senador' WHEN 'senadora' THEN 'Senadora' WHEN 'senhor' THEN 'Senhor' WHEN 'senhora' THEN 'Senhora' WHEN 'senhoria' THEN 'Senhoria' WHEN 'senhorinha' THEN 'Senhorinha' WHEN 'senhorita' THEN 'Senhorita' WHEN 'seresteiro' THEN 'Seresteiro' WHEN 'seringueiro' THEN 'Seringueiro' WHEN 'serralheiro' THEN 'Serralheiro' WHEN 'sertanista' THEN 'Sertanista' WHEN 'serventuario' THEN 'Serventuario' WHEN 'servidor' THEN 'Servidor' WHEN 'servidor publico municipal' THEN 'ServidorPublicoMunicipal' WHEN 'seu' THEN 'Seu' WHEN 'sindicalista' THEN 'Sindicalista' WHEN 'sinha' THEN 'Sinha' WHEN 'sinho' THEN 'Sinho' WHEN 'sir' THEN 'Sir' WHEN 'sobrinha' THEN 'Sobrinha' WHEN 'sobrinho' THEN 'Sobrinho' WHEN 'sociologa' THEN 'Sociologa' WHEN 'sociologo' THEN 'Sociologo' WHEN 'sogro' THEN 'Sogro' WHEN 'soldado' THEN 'Soldado' WHEN 'soldado bombeiro' THEN 'SoldadoBombeiro' WHEN 'soldado constitucionalista' THEN 'SoldadoConstitucionalista' WHEN 'soldado expedicionario' THEN 'SoldadoExpedicionario' WHEN 'soldado policia militar' THEN 'SoldadoPoliciaMilitar' WHEN 'soror' THEN 'Soror' WHEN 'suboficial' THEN 'Suboficial' WHEN 'subtenente' THEN 'Subtenente' WHEN 'sultana' THEN 'Sultana' WHEN 'sultao' THEN 'Sultao' WHEN 'supervisor' THEN 'Supervisor' WHEN 'tabelia' THEN 'Tabelia' WHEN 'tabeliao' THEN 'Tabeliao' WHEN 'tabelioa' THEN 'Tabelioa' WHEN 'taifeiro' THEN 'Taifeiro' WHEN 'taxista' THEN 'Taxista' WHEN 'teatrologo' THEN 'Teatrologo' WHEN 'tecnico' THEN 'Tecnico' WHEN 'tecnico agricola' THEN 'TecnicoAgricola' WHEN 'telegrafista' THEN 'Telegrafista' WHEN 'tenente' THEN 'Tenente' WHEN 'tenente aviador' THEN 'TenenteAviador' WHEN 'tenente brigadeiro' THEN 'TenenteBrigadeiro' WHEN 'tenente coronel' THEN 'TenenteCoronel' WHEN 'tenente coronel aviador' THEN 'TenenteCoronelAviador' WHEN 'tenente general' THEN 'TenenteGeneral' WHEN 'tenente policia militar' THEN 'TenentePoliciaMilitar' WHEN 'tenista' THEN 'Tenista' WHEN 'tenor' THEN 'Tenor' WHEN 'terceiro sargento' THEN 'TerceiroSargento' WHEN 'terceiro sargento pm' THEN 'TerceiroSargentoPm' WHEN 'tia' THEN 'Tia' WHEN 'tio' THEN 'Tio' WHEN 'tipografo' THEN 'Tipografo' WHEN 'titio' THEN 'Titio' WHEN 'topografo' THEN 'Topografo' WHEN 'trabalhador' THEN 'Trabalhador' WHEN 'tradicionalista' THEN 'Tradicionalista' WHEN 'trovador' THEN 'Trovador' WHEN 'universitaria' THEN 'Universitaria' WHEN 'universitario' THEN 'Universitario' WHEN 'vaqueiro' THEN 'Vaqueiro' WHEN 'velha' THEN 'Velha' WHEN 'velho' THEN 'Velho' WHEN 'veneravel' THEN 'Veneravel' WHEN 'vereador' THEN 'Vereador' WHEN 'vereadora' THEN 'Vereadora' WHEN 'vereador doutor' THEN 'VereadorDoutor' WHEN 'vereador professor' THEN 'VereadorProfessor' WHEN 'veterano' THEN 'Veterano' WHEN 'veterinario' THEN 'Veterinario' WHEN 'vice' THEN 'Vice' WHEN 'vice almirante' THEN 'ViceAlmirante' WHEN 'vice governador' THEN 'ViceGovernador' WHEN 'vicentino' THEN 'Vicentino' WHEN 'vice prefeito' THEN 'VicePrefeito' WHEN 'vice presidente' THEN 'VicePresidente' WHEN 'vice rei' THEN 'ViceRei' WHEN 'vigario' THEN 'Vigario' WHEN 'vigia' THEN 'Vigia' WHEN 'vigilante' THEN 'Vigilante' WHEN 'violeiro' THEN 'Violeiro' WHEN 'violinista' THEN 'Violinista' WHEN 'violonista' THEN 'Violonista' WHEN 'virgem' THEN 'Virgem' WHEN 'visconde' THEN 'Visconde' WHEN 'viscondessa' THEN 'Viscondessa' WHEN 'viuva' THEN 'Viuva' WHEN 'vo' THEN 'Vo' WHEN 'voluntaria' THEN 'Voluntaria' WHEN 'voluntario' THEN 'Voluntario' WHEN 'voluntarios' THEN 'Voluntarios' WHEN 'vovo' THEN 'Vovo' -- ELSE NULL END; END; /* -- Depreciated -- 3. Função principal que processa a string inteira de forma colada (CamelCase) DROP FUNCTION IF EXISTS endereco_to_camel_correios; CREATE OR REPLACE FUNCTION endereco_to_camel_correios(p_name text) RETURNS text LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE BEGIN ATOMIC -- Opcional: Aqui poderíamos fatiar ou passar por uma lógica que identifica -- se a primeira palavra é tipo/título, mas se você aplica a string inteira -- palavra por palavra, veja como fica a lógica unificada de transformação: -- Se preferir tratar a string dividida por palavras e aplicar as regras: SELECT string_agg( CASE WHEN i = 1 THEN shrink_logradouro_tipo(p) -- Trata a primeira palavra como tipo (ex: Rua -> R) WHEN i = 2 AND lower(unaccent(p)) IN ('dr', 'doutor', 'cel', 'coronel', 'prof', 'professor', 'gen', 'general') THEN shrink_logradouro_titulo(p) -- Trata segunda palavra se for título ELSE initcap(lower(unaccent(p))) END, '' ) FROM regexp_split_to_table(p_name, '[\. ]+') WITH ORDINALITY t(p, i); END; COMMENT ON FUNCTION endereco_to_camel_correios(text) IS 'Converte nome de logradouro para formato colado (CamelCase), sem acentos, sem pontos e com abreviações padrão dos Correios.'; */ CREATE OR REPLACE FUNCTION endereco_to_camel_correios( p_name text, p_processar_tipo_titulo boolean DEFAULT true ) RETURNS text LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE AS $$ DECLARE v_clean text; v_palavras text[]; v_total_palv int; v_tipo text := ''; v_titulo text := NULL; v_resto text := ''; i int := 1; k int; v_slice text; v_res text; v_p_lower text; v_is_ultima boolean; v_resultado text := ''; v_forbidden_words text[] := ARRAY['de', 'da', 'do', 'dos', 'das', 'no', 'na', 'nos', 'nas', 'pela', 'pelo', 'para', 'em', 'por', 'com', 'e', 'a', 'o', 'as', 'os']; BEGIN -- 1. Limpeza inicial: troca hífens por espaço e remove espaços excessivos v_clean := trim(regexp_replace(regexp_replace(p_name, '-', ' ', 'g'), '\s+', ' ', 'g')); v_palavras := regexp_split_to_array(v_clean, '\s+'); v_total_palv := array_length(v_palavras, 1); IF v_total_palv IS NULL OR v_total_palv = 0 THEN RETURN ''; END IF; i := 1; -- Se o parâmetro estiver ativo, executa a detecção de tipo e título IF p_processar_tipo_titulo THEN -- 2. Detecção do TIPO (Janela decrescente: testa de 3 palavras até 1 palavra no início) FOR k IN REVERSE LEAST(v_total_palv, 3)..1 LOOP v_slice := array_to_string(v_palavras[1:k], ' '); v_res := shrink_logradouro_tipo(v_slice); IF v_res IS NOT NULL AND v_res <> '' THEN v_tipo := v_res; i := k + 1; EXIT; END IF; END LOOP; -- Fallback se nenhum tipo cadastrado for encontrado IF v_tipo = '' AND v_total_palv >= 1 THEN v_tipo := initcap(unaccent(v_palavras[1])); i := 2; END IF; -- 3. Detecção do TÍTULO (Janela decrescente a partir do índice atual `i`) IF i <= v_total_palv THEN FOR k IN REVERSE LEAST(v_total_palv - i + 1, 3)..1 LOOP v_slice := array_to_string(v_palavras[i:i+k-1], ' '); v_res := shrink_logradouro_titulo(v_slice); IF v_res IS NOT NULL AND v_res <> '' AND NOT (lower(unaccent(v_res)) = ANY(v_forbidden_words)) THEN v_titulo := v_res; i := i + k; EXIT; END IF; END LOOP; END IF; ELSE -- Se falso, começa do índice 1 e trata tudo como corpo/resto i := 1; END IF; -- 4. Processamento do RESTO (Exclui preposições/conjunções do miolo) WHILE i <= v_total_palv LOOP v_p_lower := lower(unaccent(v_palavras[i])); v_is_ultima := (i = v_total_palv); -- Ignora preposições/conjunções se não forem a última palavra IF NOT v_is_ultima AND v_p_lower = ANY(v_forbidden_words) THEN i := i + 1; CONTINUE; END IF; v_resto := v_resto || initcap(unaccent(regexp_replace(v_palavras[i], '[\.]', '', 'g'))); i := i + 1; END LOOP; -- 5. Montagem Final segura (evita underscores vazios/iniciais) IF v_tipo <> '' THEN v_resultado := v_tipo; END IF; IF v_titulo IS NOT NULL AND v_titulo <> '' THEN v_resultado := CASE WHEN v_resultado = '' THEN v_titulo ELSE v_resultado || '_' || v_titulo END; END IF; IF v_resto <> '' THEN v_resultado := CASE WHEN v_resultado = '' THEN v_resto ELSE v_resultado || '_' || v_resto END; END IF; RETURN v_resultado; END; $$; -- Teste da função de Tipos de Logradouro SELECT shrink_logradouro_tipo('Rua') AS tipo_1, shrink_logradouro_tipo('AvEnida') AS tipo_2, shrink_logradouro_tipo('Praça') AS tipo_3, shrink_logradouro_tipo('ALAMEDA') AS tipo_4, shrink_logradouro_tipo('Desconhecido') AS tipo_5; -- Teste da função de Títulos SELECT shrink_logradouro_titulo('Doutor') AS titulo_1, shrink_logradouro_titulo('Coronel') AS titulo_2, shrink_logradouro_titulo('PROFESSOR') AS titulo_3, shrink_logradouro_titulo('Padre') AS titulo_4, shrink_logradouro_titulo('Engenheiro') AS titulo_5; SELECT input_text, endereco_to_camel_correios(input_text, True) AS resultado_camel FROM ( VALUES -- Teste 1: Rua simples ('Rua João da Silva'), -- Teste 2: Avenida com título na segunda posição (Doutor) ('Avenida Doutor Pedro Alvares'), -- Teste 3: Rua com título de Coronel ('Rua Coronel Fabriciano'), -- Teste 4: Praça com título de Professor ('Praça Professor Carlos Alberto'), -- Teste 5: Logradouro com caracteres especiais, acentos e espaços duplos (' ALAMEDA DO SÃO JOÃO '), -- Teste 6: Tipo de logradouro com abreviação customizada ('Rodovia Padre Cicero'), -- Teste Extras ('3ª Travessa Engenheiro Dantas de Oliveira'), ('1º Beco da Rua Gama'), ('Anel Rodoviário Vice-Prefeito Manoel da Nobrega'), ('Acesso para a Rua Pará'), ('Núcleo Habitacional Vice Prefeito Jose da Silva Pará'), ('Vila Aposentado Jonas') ) AS t(input_text); ----------------------- -- FUNCTIONS : END -- ----------------------- /* CREATE OR REPLACE VIEW public.cep_string_padronizada AS SELECT -- Formato ajustado: logradouro, complemento • bairro, municipio - uf, CEP 12345-678 TRIM( COALESCE(c.logradouro, '') || CASE WHEN NULLIF(BTRIM(c.complemento), '') IS NOT NULL THEN ', ' || c.complemento ELSE '' END || CASE WHEN NULLIF(BTRIM(c.bairro), '') IS NOT NULL THEN ' • ' || c.bairro ELSE '' END || CASE WHEN NULLIF(BTRIM(c.municipio), '') IS NOT NULL THEN ', ' || c.municipio ELSE '' END || CASE WHEN NULLIF(BTRIM(c.uf), '') IS NOT NULL THEN ' - ' || c.uf ELSE '' END || ', CEP ' || -- Formata o CEP no padrão 12345-678 caso ainda não esteja formatado CASE WHEN t.cep ~ '^\d{8}$' THEN LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) ELSE t.cep END ) AS endereco_postal, -- String compacta para C1 (o próprio CEP formatado com hífen) LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) AS string_compacta, -- Classificação do caso 'C1' AS caso FROM cep_tipologia t JOIN public.cep_unificado_plus c ON t.cep::text = c.cep::text WHERE t.tipo_cep IN ('GRANDE_USUARIO', 'UNIDADE_OPERACIONAL', 'CAIXA_POSTAL') UNION ALL SELECT -- Formato do endereço postal com o coringa no lugar do número e separador • antes do bairro TRIM( COALESCE(c.logradouro, '') || ', {{numeroemodificador}}' || -- numeroemodificador no formato numero-modificador, ex: 100-A, onde nem sempre tem o modificador CASE WHEN NULLIF(BTRIM(c.bairro), '') IS NOT NULL THEN ' • ' || c.bairro ELSE '' END || CASE WHEN NULLIF(BTRIM(c.municipio), '') IS NOT NULL THEN ', ' || c.municipio ELSE '' END || CASE WHEN NULLIF(BTRIM(c.uf), '') IS NOT NULL THEN ' - ' || c.uf ELSE '' END || ', CEP ' || -- Formatação do CEP (12345-678) LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) AS endereco_postal, -- String compacta para C2: CEP formatado ~ {{numero}}-{{modificador}} LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) || '~{{numeroemodificador}}' AS string_compacta, -- numeroemodificador no formato numero_modificador, ex: 100_A, onde nem sempre tem o modificador -- Classificação do caso 'C2' AS caso FROM cep_tipologia t JOIN public.cep_unificado_plus c ON t.cep::text = c.cep::text WHERE t.tipo_cep IN ('LOGRADOURO-ABRANGENCIA_NUMERICA', 'LOGRADOURO-SECCIONADO_EXPLICITO', 'LOGRADOURO-SIMPLES') UNION ALL SELECT -- Endereço postal genérico com coringas para logradouro e número TRIM( '{{logradouro}}, {{numeroemodificador}}' || -- Tenta puxar o bairro real, mas mantém o padrão se houver, ou usa • bairro CASE WHEN NULLIF(BTRIM(c.bairro), '') IS NOT NULL THEN ' • ' || c.bairro ELSE '' END || CASE WHEN NULLIF(BTRIM(c.municipio), '') IS NOT NULL THEN ', ' || c.municipio ELSE '' END || CASE WHEN NULLIF(BTRIM(c.uf), '') IS NOT NULL THEN ' - ' || c.uf ELSE '' END || ', CEP ' || LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) ) AS endereco_postal, -- String compacta para C3 corrigida com a concatenação correta (||) LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) || '-' || COALESCE(NULLIF(BTRIM(c.bairro), ''), '{{bairro}}') || '-{{tipo_logradouro}}_{{tituloenomelogradouro}}~{{numeroemodificador}}' AS string_compacta, -- Classificação do caso 'C3' AS caso FROM cep_tipologia t JOIN public.cep_unificado_plus c ON t.cep::text = c.cep::text WHERE t.tipo_cep IN ('LOCALIDADE') ; -- Version 2 DROP MATERIALIZED VIEW IF EXISTS public.cep_string_padronizada; CREATE MATERIALIZED VIEW public.cep_string_padronizada AS SELECT -- Endereço Postal condicional por Caso TRIM( CASE -- Caso C3: Logradouro/número genérico • Localidade/Bairro, Município - UF, CEP WHEN t.tipo_cep IN ('LOCALIDADE') THEN '{{logradouro}}, {{numeroemodificador}} • ' || COALESCE(NULLIF(BTRIM(c.bairro), ''), '{{bairro}}') ELSE COALESCE(c.logradouro, '') || CASE WHEN t.tipo_cep IN ('GRANDE_USUARIO', 'UNIDADE_OPERACIONAL', 'CAIXA_POSTAL') AND NULLIF(BTRIM(c.complemento), '') IS NOT NULL THEN ', ' || c.complemento WHEN t.tipo_cep IN ('LOGRADOURO-ABRANGENCIA_NUMERICA', 'LOGRADOURO-SECCIONADO_EXPLICITO', 'LOGRADOURO-SIMPLES') THEN ', {{numeroemodificador}}' ELSE '' END || CASE WHEN NULLIF(BTRIM(c.bairro), '') IS NOT NULL THEN ' • ' || c.bairro ELSE '' END END || -- Município e UF oficiais vindos da tabela unificada CASE WHEN NULLIF(BTRIM(c.municipio), '') IS NOT NULL THEN ', ' || c.municipio ELSE '' END || CASE WHEN NULLIF(BTRIM(c.uf), '') IS NOT NULL THEN ' - ' || c.uf ELSE '' END || -- CEP Formatado ', CEP ' || LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) ) AS endereco_postal, -- String Compacta condicional por Caso CASE -- Caso C1 WHEN t.tipo_cep IN ('GRANDE_USUARIO', 'UNIDADE_OPERACIONAL', 'CAIXA_POSTAL') THEN LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) -- Caso C2 WHEN t.tipo_cep IN ('LOGRADOURO-ABRANGENCIA_NUMERICA', 'LOGRADOURO-SECCIONADO_EXPLICITO', 'LOGRADOURO-SIMPLES') THEN LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) || '~{{numeroemodificador_compacto}}' -- Caso C3 WHEN t.tipo_cep IN ('LOCALIDADE') THEN LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) || '-' || COALESCE(NULLIF(BTRIM(c.bairro), ''), '{{bairro}}') || '-{{tipo_logradouro}}_{{tituloenomelogradouro}}~{{numeroemodificador_compacto}}' END AS string_compacta, -- Classificação do Caso CASE WHEN t.tipo_cep IN ('GRANDE_USUARIO', 'UNIDADE_OPERACIONAL', 'CAIXA_POSTAL') THEN 'C1' WHEN t.tipo_cep IN ('LOGRADOURO-ABRANGENCIA_NUMERICA', 'LOGRADOURO-SECCIONADO_EXPLICITO', 'LOGRADOURO-SIMPLES') THEN 'C2' WHEN t.tipo_cep IN ('LOCALIDADE') THEN 'C3' END AS caso FROM cep_tipologia t LEFT JOIN public.cep_unificado c ON BTRIM(t.cep::text) = BTRIM(c.cep::text); -- Índice essencial para performance CREATE INDEX idx_cep_string_cep ON public.cep_string_padronizada (string_compacta); */ OU -- Version 3 -- Roda em ~ 3 min DROP MATERIALIZED VIEW IF EXISTS public.cep_string_padronizada; CREATE MATERIALIZED VIEW public.cep_string_padronizada AS SELECT -- Endereço Postal Legível TRIM( CASE WHEN t.tipo_cep IN ('LOCALIDADE') THEN COALESCE(NULLIF(BTRIM(c.bairro), ''), c.municipio) ELSE COALESCE(c.logradouro, '') || CASE WHEN t.tipo_cep IN ('GRANDE_USUARIO', 'UNIDADE_OPERACIONAL', 'CAIXA_POSTAL') AND NULLIF(BTRIM(c.complemento), '') IS NOT NULL THEN ', ' || c.complemento ELSE '' END || CASE WHEN NULLIF(BTRIM(c.bairro), '') IS NOT NULL THEN ' • ' || c.bairro ELSE '' END END || CASE WHEN NULLIF(BTRIM(c.municipio), '') IS NOT NULL THEN ', ' || c.municipio ELSE '' END || CASE WHEN NULLIF(BTRIM(c.uf), '') IS NOT NULL THEN ' - ' || c.uf ELSE '' END || ', CEP ' || LEFT(t.cep, 5) || '-' || RIGHT(t.cep, 3) ) AS endereco_postal, -- String Compacta Hierárquica estrita (Bairro limpo via função com parâmetro False) CASE -- Caso C1: Grandes Usuários / Caixas Postais / Unidades WHEN t.tipo_cep IN ('GRANDE_USUARIO', 'UNIDADE_OPERACIONAL', 'CAIXA_POSTAL') THEN SUBSTRING(j.isolabel_ext, 4) || '-' || endereco_to_camel_correios(COALESCE(c.logradouro, '')) || CASE WHEN NULLIF(BTRIM(c.complemento), '') IS NOT NULL THEN '~' || c.complemento ELSE '' END -- Caso C2: Logradouros Comuns WHEN t.tipo_cep IN ('LOGRADOURO-ABRANGENCIA_NUMERICA', 'LOGRADOURO-SECCIONADO_EXPLICITO', 'LOGRADOURO-SIMPLES') THEN SUBSTRING(j.isolabel_ext, 4) || '-' || endereco_to_camel_correios(COALESCE(c.logradouro, '')) -- Caso C3: Localidade (Bairro/Município limpo sem abreviação de logradouro) WHEN t.tipo_cep IN ('LOCALIDADE') THEN SUBSTRING(j.isolabel_ext, 4) || '-' || endereco_to_camel_correios(COALESCE(NULLIF(BTRIM(c.bairro), ''), NULLIF(BTRIM(c.municipio), '')), FALSE) END AS string_compacta, -- Classificação do Caso CASE WHEN t.tipo_cep IN ('GRANDE_USUARIO', 'UNIDADE_OPERACIONAL', 'CAIXA_POSTAL') THEN 'C1' WHEN t.tipo_cep IN ('LOGRADOURO-ABRANGENCIA_NUMERICA', 'LOGRADOURO-SECCIONADO_EXPLICITO', 'LOGRADOURO-SIMPLES') THEN 'C2' WHEN t.tipo_cep IN ('LOCALIDADE') THEN 'C3' END AS caso, -- Coluna para o "Tipo-Falta" CASE WHEN t.tipo_cep IN ('LOGRADOURO-ABRANGENCIA_NUMERICA', 'LOGRADOURO-SECCIONADO_EXPLICITO', 'LOGRADOURO-SIMPLES') THEN 'C2-numero_predial' WHEN t.tipo_cep IN ('LOCALIDADE') THEN 'C3-bairro_e_numero' ELSE 'C1-geral' END AS tipo_falta, t.cep AS cep_bruto FROM cep_tipologia t LEFT JOIN public.cep_unificado c ON BTRIM(t.cep::text) = BTRIM(c.cep::text) LEFT JOIN imported.jurisdiction j ON c.municipio_cod_ibge::bigint = j.cod_ibge::bigint; -- Índice essencial para performance na string compacta final CREATE INDEX idx_cep_string_compacta ON public.cep_string_padronizada (string_compacta); SELECT * FROM public.cep_string_padronizada --WHERE caso = 'C2' LIMIT 1111; SELECT t.cep, c.municipio, up.municipio_cod_ibge, j.cod_ibge, j.isolabel_ext FROM cep_tipologia t LEFT JOIN public.cep_unificado c ON BTRIM(t.cep::text) = BTRIM(c.cep::text) LEFT JOIN public.cep_unificado_plus up ON REGEXP_REPLACE(t.cep::text, '[^0-9]', '', 'g') = REGEXP_REPLACE(up.cep::text, '[^0-9]', '', 'g') LEFT JOIN imported.jurisdiction j ON up.municipio_cod_ibge::bigint = j.cod_ibge::bigint WHERE t.cep::text LIKE '%97120000%'; ////////////////////////////// EXEMPLO DE ENDERECOS - Rodar em demogov /////////////////////////////////// DROP VIEW IF EXISTS public.cnefe_enderecos_processados_exemplo; CREATE VIEW public.cnefe_enderecos_processados_exemplo AS SELECT cep, -- Bairro / Localidade NULLIF(BTRIM(dsc_localidade), '') AS bairro, -- {{tipo_logradouro}} NULLIF(BTRIM(nom_tipo_seglogr), '') AS tipo_logradouro, -- {{tituloenomelogradouro}} (Título + Nome juntos, blindado contra espaços duplos) NULLIF( REGEXP_REPLACE( TRIM(COALESCE(nom_titulo_seglogr, '') || ' ' || COALESCE(nom_seglogr, '')), '\s+', ' ', 'g' ), '' ) AS tituloenomelogradouro, -- Logradouro completo padrão (Tipo + Título + Nome) NULLIF( REGEXP_REPLACE( TRIM(COALESCE(nom_tipo_seglogr, '') || ' ' || COALESCE(nom_titulo_seglogr, '') || ' ' || COALESCE(nom_seglogr, '')), '\s+', ' ', 'g' ), '' ) AS logradouro, -- {{numeroemodificador}} padrão para o endereço postal (ex: 100-A ou apenas 100 se o modificador for nulo) NULLIF( BTRIM(num_endereco) || CASE WHEN NULLIF(BTRIM(dsc_modificador), '') IS NOT NULL THEN '-' || BTRIM(dsc_modificador) ELSE '' END, '' ) AS numeroemodificador, -- {{numeroemodificador_compacto}} específico para a string compacta (ex: 100_A ou apenas 100 se o modificador for nulo) NULLIF( BTRIM(num_endereco) || CASE WHEN NULLIF(BTRIM(dsc_modificador), '') IS NOT NULL THEN '_' || BTRIM(dsc_modificador) ELSE '' END, '' ) AS numeroemodificador_compacto FROM public.ibge_cnefe2022 WHERE cod_municipio = '4316907' AND num_endereco IS NOT NULL AND num_endereco <> '0' GROUP BY cod_municipio, cep, dsc_localidade, nom_tipo_seglogr, nom_titulo_seglogr, nom_seglogr, num_endereco, dsc_modificador; -- Criando índice para performance nos cruzamentos futuros CREATE INDEX idx_cnefe_proc_cep ON public.cnefe_enderecos_processados (cep);