SQL 使用 between 语法验证字母数字值
SQL using between syntax to validate alpha numeric values
我有 2 个表,表 1 有地址范围,表 2 有精确地址。两个表中的所有字段都是字符。我需要确定表 2 中位于表 1 中门牌号范围之间的地址。请看下面的例子。我在 LOW 和 HIGH 之间加入了 Street、City、State 和 HSE#。结果带回了 1201 - 1214 和 101 - 126 TABLE1 记录。将值转换为整数是行不通的,因为某些地址包含字母字符....例如 101B 作为门牌号。你能帮助确定完成此任务的最佳、最准确的方法吗?
表 1
LOW HIGH STREET CITY STATE
101 126 A ST MYCITY MYSTATE
1201 1214 A ST MYCITY MYSTATE
表 2
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 记录。预期结果是我只得到 LOW/HIGH 范围为 1201/1214 的 TABLE1 值,因为这确实是门牌号所在的范围。
按原样尝试:
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|
我有 2 个表,表 1 有地址范围,表 2 有精确地址。两个表中的所有字段都是字符。我需要确定表 2 中位于表 1 中门牌号范围之间的地址。请看下面的例子。我在 LOW 和 HIGH 之间加入了 Street、City、State 和 HSE#。结果带回了 1201 - 1214 和 101 - 126 TABLE1 记录。将值转换为整数是行不通的,因为某些地址包含字母字符....例如 101B 作为门牌号。你能帮助确定完成此任务的最佳、最准确的方法吗?
表 1
LOW HIGH STREET CITY STATE
101 126 A ST MYCITY MYSTATE
1201 1214 A ST MYCITY MYSTATE
表 2
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 记录。预期结果是我只得到 LOW/HIGH 范围为 1201/1214 的 TABLE1 值,因为这确实是门牌号所在的范围。
按原样尝试:
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|