Estou tentando filtrar um número de série distinto de uma tabela e juntar duas tabelas. Atual meu código parece
SELECT DISTINCT ON (t1.serial_nbr) t1.*, q1.serl_nbr
FROM ( select
serial_nbr,
CASE
when substring(serial_nbr FROM 2 for 2) = '18' THEN
regexp_replace(serial_nbr,'(...)(\w{{5}})','\\1 \\2')
when substring(serial_nbr FROM 2 for 2) = '19' AND length(serial_nbr) = 9 THEN
regexp_replace(serial_nbr,'(...)(\w{{6}})','\\1 \\2')
ELSE serial_nbr END as serial
FROM controller_returns) as t1
LEFT JOIN dblink('{param_db}',
'SELECT DISTINCT ctrlr_serl_nbr,insert_ts
FROM ctrlr_basic_setng')
as q1(ctrlr_serl character varying,insert_ts timestamp without time zone)
on q1.ctrlr_serl_nbr = t1.serial
WHERE t1.serial_nbr~'^[ABCD]([AC0-9]{{1,9}})'
ORDER by t1.serial_nbr, substring(t1.serial_nbr from 2 for 2), substring(t1.serial_nbr from 1 for 1)
Estou usando postgreSQL e conectando usando psycopg2 em python.
Este é um código em evolução, mas notei que o número de série que estou recebendo não é realmente distinto. Às vezes, eu recebia casos como este 'A1800038' e 'A1800038\n'. O que estou tentando descobrir é como filtrar o serial com \n. Eu estava tentando fazer isso na cláusula WHERE fazendo '^[ABCD]([AC0-9][^\\n]{{1,9}})'
ou '^[ABCD]([AC0-9][^[:space:]]{{1,9}})'
mas nenhum dos dois funciona.
Qualquer ajuda seria muito apreciada.
Adicione isso na subconsulta
t1
:Você tem que dobrar
\
para remover seu significado especial. Para identificar caracteres de nova linha reais (E'\n'
- código ASCII 10), use um único\
em vez disso.$
significa o fim da string.Dito isso, você pode usar
LIKE
expressões mais baratas em sua consulta: