我正在尝试从表中过滤不同的序列号并加入两个表。当前我的代码看起来像
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)
我正在使用 postgreSQL 并通过在 python 中使用 psycopg2 进行连接。
这是不断发展的代码,但我注意到我得到的序列号并不是真正不同的。我有时会遇到像“A1800038”和“A1800038\n”这样的情况。我想弄清楚的是如何用 \n 过滤掉序列号。我试图在 WHERE 子句中执行此操作'^[ABCD]([AC0-9][^\\n]{{1,9}})'
,'^[ABCD]([AC0-9][^[:space:]]{{1,9}})'
但都不起作用。
任何帮助将非常感激。
在子查询中添加
t1
:您必须加倍
\
才能删除其特殊含义。要识别实际的换行符(E'\n'
- ASCII 代码 10),请改用单个\
。$
表示字符串的结束。也就是说,您可以
LIKE
在查询中使用更便宜的表达式: