首页 > 解决方案 > 加入选定的位数

问题描述

ddm_zip 列只有 5 位邮政编码。tt_pad_zip 列包含 2-5 之间的任何值。我想执行一个连接选择出现在表格两侧的值。

但是,tt_pad_zip 具有各种级别的粒度。

例如,当我们在 tt_pad_zip 中看到 55 的值时,它正在考虑所有以 55 开头的邮政编码,例如 551...553...55636 等。因此我希望连接选择这个。

例如,当我们在 tt_pad_zip 中看到 558 的值时,它正在考虑以 558 开头的所有邮政编码,例如 5581...5585...558743 等。因此我希望连接选择这个。

但是,如果 tt_pad_zip 中有一个值具有与 ddm_zip 相同的邮政编码,例如 58636,如下所示,我希望输出选择这个。

column: ddm_zip       column: tt_pad_zip
55636                 55
57254                 5734
58636                 57254
                      58636

标签: sqloracle

解决方案


我认为您正在寻找类似以下的内容:

-- Sample Data:
WITH dat (ddm_zip, tt_pad_zip) AS 
  (SELECT 0,55 FROM dual
    UNION ALL 
     SELECT 1,5734 FROM dual
    UNION ALL
     SELECT 2,57254 FROM dual
    UNION ALL  
     SELECT 3,55636 FROM dual
    UNION ALL
     SELECT 55636, 99 FROM dual
    UNION ALL  
     SELECT 57254, 88 FROM dual
    UNION ALL  
     SELECT 57341, 77 FROM dual)
-- Query:
SELECT d2.ddm_zip, d1.tt_pad_zip 
  FROM dat d1
  JOIN dat d2 
   -- Join the data via like:
    ON d2.ddm_zip LIKE d1.tt_pad_zip || '%'
   -- Exclude the data where a "better" match exists:
   AND NOT EXISTS (SELECT 1 FROM dat d3
                    WHERE d2.ddm_zip LIKE d3.tt_pad_zip || '%'
                      AND LENGTH(d1.tt_pad_zip) < LENGTH(d3.tt_pad_zip))

推荐阅读