【问题标题】:How to parse apt no from the address field in SQL [closed]如何从 SQL 中的地址字段解析 apt no [关闭]
【发布时间】:2021-08-15 03:42:54
【问题描述】:

我需要将数据中的最后一个数字提取为 APTNO?

[在此处输入图片描述][1]

下图中我的数据。我几乎可以得到我的结果,但我想要号码,当有 APT 时,我也想要 APT 号码

【问题讨论】:

  • 所有地址的末尾都有公寓/套房号码吗?到目前为止,您尝试了什么,遇到了什么问题?
  • 根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。说真的,每个地址都有公寓号码吗?我会感到非常惊讶,您需要显示代表更广泛数据集的数据。请不要对我们大喊大叫,即不要使用所有大写字母。
  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)

标签: sql sql-server tsql


【解决方案1】:

对于您的示例,您可以使用string_split():

select t.*, s.value as the_number
from t cross apply
     (select top (1) s.value
      from string_split(t.address, ' ') s
      where s.value not like '%[^0-9]%' 
      order by charindex(' ' + s.value + ' ', ' ' + t.address + ' ') desc
     ) s

【讨论】:

    【解决方案2】:

    Gordon 的回答非常适用于 SQL 2016 及更高版本。对于旧版本,这可以工作。

    SELECT  t.Address
            ,REVERSE(LEFT(REVERSE(t.Address), CHARINDEX(' ', REVERSE(t.Address), 0))) AS ApartmentNum
    FROM    Table AS t;
    

    【讨论】:

    • 感谢您抽出宝贵时间,这段代码不起作用
    【解决方案3】:

    另一种基于 JSON 的方法。

    它将从 SQL Server 2016 开始工作。

    SQL Server 2016

    -- DDL and sample data population, start
    DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, tokens VARCHAR(250));  
    INSERT Into @tbl (tokens) VALUES 
    ('250 Cambridge ST 305'),
    ('30 ACKERS AVE 2');
    -- DDL and sample data population, end
    
    DECLARE @Word INT = 4;
    SELECT * 
        , token = JSON_VALUE('["' +
            REPLACE(REPLACE(tokens
                ,'"','\"')
                ,' ','","') +
            '"]', CONCAT('$[', @Word-1,']'))
    FROM @tbl ;
    

    SQL Server 2008 及以上版本

    基于 XML/XQuery 的方法。当每行的标记数量波动(或未知)时很有用。

    DECLARE @separator CHAR(1) = SPACE(1);
    SELECT * 
        , TRY_CAST('<root><r><![CDATA[' + 
        REPLACE(tokens, @separator, ']]></r><r><![CDATA[') + 
        ']]></r></root>' AS XML).value('(/root/r[last()]/text())[1]', 'NVARCHAR(30)') AS token
    FROM @tbl;
    

    输出

    +----+----------------------+-------+
    | ID |        tokens        | token |
    +----+----------------------+-------+
    |  1 | 250 Cambridge ST 305 |   305 |
    |  2 | 30 ACKERS AVE 2      |     2 |
    +----+----------------------+-------+
    

    【讨论】:

    • 但我仍然无法按照我想要的方式工作,我只是想获得 Apt 号码,只要我们有缩写 APT,那么它应该在那里得到所有东西
    • @sindhurilokesh,正如我之前提到的,您需要提供一个最小的可重现示例。所有##1-4。当它完成时。我可以重新打开你的帖子。
    • 这段代码帮助了我,但我仍然达到了我的确切结果
    • @sindhurilokesh,再次编辑您的问题,将问题放在那里 ##1-4。我会帮助你得到你所需要的。
    猜你喜欢
    • 2016-03-14
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    相关资源
    最近更新 更多