【问题标题】:SQL between query issue查询问题之间的 SQL
【发布时间】:2011-12-08 19:24:29
【问题描述】:

我有 2 张桌子。 一个带有地址(分别是姓名和门牌号),另一个带有区域,其中有街道号码和来自和去往的字段。例如。欧洲地区是属于街道欧洲街道的一切,从 1 到 200 街道号。 我需要加入每个地址属于适当区域的位置。但是需要注意的是,门牌号码也可以是 120a、120b、120c 等。我无法通过简单的“介于”来实现这一点,并且我的数字 120a 落入了错误的范围。

它是 MS SQL Server 精简版

Table 1
1st street | 22
1st street | 22a
1st street | 24
1st street | 33
1st street | 112a




Table2
Region 1 | 1st street | 1 | 30
Region 2 | 1st street | 31 | 40
Region 3 | 1st street | 41 | 200

所以我想合并它们以获得结果,例如 1st street 22, 22a, 24 属于 Region 1,因为街道编号介于 1 和 30 之间。

提前致谢

【问题讨论】:

  • 请编辑您的问题以提供示例数据、所需的输出以及您迄今为止尝试过但不起作用的查询。此外,请为您正在使用的数据库添加标签,因为不同的 RDBMS 之间的语法和功能会有所不同。谢谢。 :)
  • 你能写一个sqlLite UDF吗?我想如果你写一个 UDF 来转换 22a、112a 等。到整数,然后使用该函数,将是最安全的选择,虽然它可能会影响性能有点......

标签: sql between


【解决方案1】:

首先,您必须将带有扩展名的 housenr 转换为仅门牌号。您可以使用 patindex 搜索第一个非数字字符。如果没有找到,请使用整个字符串。否则使用字符串的开头直到第一个非数字字符。

cast(case 
when patindex('%[^0-9]%', housenrext) = 0 then housenrext
else substring(housenrext, 1, patindex('%[^0-9]%', housenrext) - 1)
end as int) as housenr

在子查询中使用上述构造,您可以join 到区域表中找到匹配区域:

select  *
from    (
        select  cast(case 
                when patindex('%[^0-9]%', housenrext) = 0 then housenrext
                else substring(housenrext, 1, patindex('%[^0-9]%', housenrext) - 1)
                end as int) as housenr
        ,       street
        from    @address
        ) as addr
left join
        @region region
on      addr.street = region.street
        and addr.housenr between region.startnr and region.endnr

Full example at SE Data.

【讨论】:

  • 安多玛做对了。我忘记了 112 号房子不会在 10 到 20 之间。我投票决定删除我的答案不正确。
猜你喜欢
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多