【问题标题】:Substitute expressions in CHARINDEX and LEN with values in another table用另一个表中的值替换 CHARINDEX 和 LEN 中的表达式
【发布时间】:2013-12-11 22:11:15
【问题描述】:

我有数以千计的公司名称和地址记录在一个字段 (NameAddress) 中:

Microsoft 1 157th Ave NE Redmond WA 98052
Apple Inc 1 Infinite Loop Cupertino CA 95014
Kraft Beton GmbH Industriestraße 123 1220 Wien
Pletzenauer Holzbau GmbH Moosnerweg 9 6382 Kirchdorf in Tirol

我想将城市解析为它们自己的字段。我有一个查询很好,但一次只适用于一个城市:

CASE WHEN CHARINDEX('wien',NameAddress) > 0 THEN
SUBSTRING(NameAddress,(CHARINDEX('wien',NameAddress)),LEN('wien')) ELSE '' END
AS City

我有一个 dbo.geography 表,其中包含所有这些城市的名称。是否可以将该表中的值用作上述查询中 CHARINDEX 和 LEN 命令中的表达式?

本质上,我正在检查字符串是否包含另一个表中的任何值,如果是,则创建一个包含该值的子字符串。

【问题讨论】:

    标签: sql parsing expression charindex


    【解决方案1】:

    如果geography 表中存在NameAddressCity,此查询将为您提供NameAddress 的列表

    select a.NameAddress, ISNULL(g.City, '')
    from address a
    left join geography g
      on CHARINDEX(g.City, a.NameAddress) > 0
    

    SQL Fiddle demo

    顺便说一句,它适用于真实地址吗?如果城市名称在街道名称中怎么办?

    【讨论】:

    • 为了减少误报的数量,您可以在调用 CHARINDEX 时在城市名称前后添加一个空格。假设城市名称总是在地址的中间(从不在末尾),这就像一个“全词”搜索。
    • 非常感谢!你的答案很完美。现在我需要从字符串的开头拆分名称,我认为我需要一种不同的方法。我知道可以创建通向某一点的所有字符的子字符串,即“Inc.”。是否可以针对多个标准(即 Inc. 或 Corp. 或 Ltd. 等)执行此操作?我将所有业务实体类型存储在一个单独的表中。
    • 是的,这是可能的。我认为您可以使用与上述类似的方法。
    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 2020-11-15
    • 2019-04-10
    • 1970-01-01
    • 2020-01-21
    • 2017-09-17
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多