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 语法来验证字母数值的主要内容,如果未能解决你的问题,请参考以下文章

sql查询

SQL语句中 between and

SQL中 between and 包不包括两端值

关于sql语句between and的边界问题

SQL语句怎样查询一个范围

【SQL语句】-范围查询