SQL 使用 between 语法来验证字母数值
Posted
技术标签:
【中文标题】SQL 使用 between 语法来验证字母数值【英文标题】:SQL using between syntax to validate alpha numeric values 【发布时间】:2020-03-31 17:56:20 【问题描述】:我有 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 记录。预期的结果是,我只得到了 TABLE1 值,其 LOW/HIGH 范围为 1201/1214,因为这确实是门牌号所在的范围。
【问题讨论】:
您使用的是哪个 dbms? 这里的大多数人希望样本表数据和预期结果为格式化文本,而不是图像。 嗨 Jarlh - 我正在使用 DB2。 今日提示:切换到现代、明确的JOIN
语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。 (他们真的在 2020 年教那些逗号分隔的隐式连接吗?!?我摇头。)
我建议删除字母字符并转换为整数。即使 101 已转换为 101A 和 101B,它仍然会落在 100 和 105 之间。但这仅适用于单个 alpha 后缀...它变得更加复杂...pe.usps.com/text/pub28/28ape_003.htm
【参考方案1】:
按原样尝试:
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|
【讨论】:
以上是关于SQL 使用 between 语法来验证字母数值的主要内容,如果未能解决你的问题,请参考以下文章