SQL использование синтаксиса между для проверки значений альфа-чисел c - PullRequest
0 голосов
/ 31 марта 2020

У меня есть 2 таблицы, Таблица1 имеет диапазоны адресов, Таблица2 имеет точные адреса. Все поля в обеих таблицах являются символами. Мне нужно определить адреса в таблице 2, которые попадают между диапазонами номеров домов в таблице 1. Пожалуйста, смотрите ниже, например. У меня есть объединение на улице, городе, штате и HSE # между LOW и HIGH. Результаты возвращают записи ТАБЛИЦА 1 как 1201 - 1214, так и 101 - 126. Преобразование значений в целые числа не работает, потому что некоторые адреса содержат буквенные символы .... 101B, например, номер дома. Можете ли вы помочь определить лучший и самый точный способ выполнения sh этого?

Table1

LOW     HIGH    STREET    CITY    STATE
101     126     A ST      MYCITY  MYSTATE
1201    1214    A ST      MYCITY  MYSTATE

TABLE2

HSE#      STREET    CITY    STATE
1203      A ST      MYCITY  MYSTATE

SELECT *
FROM TABLE1 A,
     TABLE2 B
WHERE B.STATE = A.STATE
  AND B.CITY = A.CITY
  AND B.STREET = A.STREET
  AND B.HSE# BETWEEN A.LOW AND A.HIGH;

Это возвращает обе записи TABLE1 в примере ниже. Ожидаемый результат заключается в том, что я получаю только значение TABLE1 с диапазоном LOW / HIGH 1201/1214, поскольку это действительно диапазон, в который входит номер дома.

1 Ответ

0 голосов
/ 31 марта 2020

Попробуйте как есть:

SELECT A.LOW, A.HIGH, B.HSE#
FROM
(
VALUES 
  ('101B', '126')
, ('1201', '1214')
) A (LOW, HIGH)
JOIN (VALUES '1203') B(HSE#)
ON 
INT(NULLIF(REGEXP_REPLACE(B.HSE#, '[^0-9]', ''), ''))
BETWEEN 
INT(NULLIF(REGEXP_REPLACE(A.LOW,  '[^0-9]', ''), ''))
AND
INT(NULLIF(REGEXP_REPLACE(A.HIGH, '[^0-9]', ''), ''));

Результат:

|LOW |HIGH|HSE#|
|----|----|----|
|1201|1214|1203|
...