Присоединиться к выбранному количеству цифр - PullRequest
0 голосов
/ 24 июня 2019

Столбец ddm_zip имеет только 5-значные почтовые индексы.Столбец tt_pad_zip содержит значения где-то между 2-5.Я хотел бы выполнить объединение, выбирая значения, которые появляются на обеих сторонах таблицы.

Однако tt_pad_zip имеет различные уровни детализации.

Например, когда мы видим значение 55 в tt_pad_zip, он учитывает все почтовые индексы, которые начинаются с 55, например, 551 ... 553...55636 и т. Д. Поэтому я хочу, чтобы соединение выбрало это.

Например, когда мы видим значение 558 в tt_pad_zip, оно учитывает все почтовые индексы, которые начинаются с 558, например, 5581 ... 5585 ...558743 и т. Д. Поэтому я хочу, чтобы соединение выбрало это.

Однако, если в tt_pad_zip есть значение с точным почтовым индексом в виде ddm_zip, например 58636, как показано ниже, я бы хотел, чтобы выходные данные выбрали это.

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

Ответы [ 4 ]

3 голосов
/ 24 июня 2019

Я думаю, вы ищете что-то вроде следующего:

-- 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))
3 голосов
/ 24 июня 2019

Присоединитесь к SUBSTR ing ddm_zip, длина которого равна значению tt_pad_zip, с которым вы сравниваете его.Либо:

SUBSTR( ddm_zip, 1, LENGTH( tt_pad_zip ) ) = tt_pad_zip

или:

ddm_zip LIKE tt_pad_zip || '%'

Установка Oracle :

CREATE TABLE table1 ( ddm_zip ) AS
SELECT '55636' FROM DUAL UNION ALL
SELECT '57254' FROM DUAL UNION ALL
SELECT '55824' FROM DUAL;

CREATE TABLE table2 ( tt_pad_zip ) AS
SELECT '55'    FROM DUAL UNION ALL
SELECT '5734'  FROM DUAL UNION ALL
SELECT '57254' FROM DUAL UNION ALL
SELECT '55636' FROM DUAL;

Запрос :

SELECT *
FROM   table1 t1
       INNER JOIN
       table2 t2
       ON t1.ddm_zip LIKE t2.tt_pad_zip || '%'

Вывод :

DDM_ZIP | TT_PAD_ZIP
:------ | :---------
55636   | 55        
55636   | 55636     
57254   | 57254     
55824   | 55        

Запрос 2 : если вы хотите максимально детальное соответствие.

SELECT DDM_ZIP,
       MAX( TT_PAD_ZIP ) AS TT_PAD_ZIP
FROM   table1 t1
       INNER JOIN
       table2 t2
       ON t1.ddm_zip LIKE t2.tt_pad_zip || '%'
GROUP BY DDM_ZIP

Выход :

DDM_ZIP | TT_PAD_ZIP
:------ | :---------
55636   | 55636     
57254   | 57254     
55824   | 55        

дБ <> скрипка здесь

2 голосов
/ 24 июня 2019

Вы можете использовать условное соединение с оператором CASE в предложении ON:

select t1.ddm_zip, t2.tt_pad_zip
from table1 t1 inner join table2 t2
on t1.ddm_zip like case 
  when exists(select 1 from table2 where tt_pad_zip = t1.ddm_zip) then t2.tt_pad_zip  
  else '%' || t2.tt_pad_zip || '%'
end

См. demo .Результаты:

> DDM_ZIP | TT_PAD_ZIP
> :------ | :---------
> 55636   | 55        
> 57254   | 57254     
> 58636   | 58636 
0 голосов
/ 24 июня 2019

Вы можете попробовать использовать операцию SUBSTR, чтобы просто сравнить первые два числа каждого столбца.Я не знаю, какой тип объединения вы хотите, имена таблиц или пример данных, но вот хороший синтаксис.

SELECT
    *

FROM
    table1 INNER JOIN table2 ON SUBSTR(ddm_zip, 1, 2) = SUBSTR(tt_pad_zip, 1,2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...