【问题标题】:Best way to get part of a number from a file name with SQL使用 SQL 从文件名中获取部分数字的最佳方法
【发布时间】:2021-11-11 15:42:02
【问题描述】:

我需要从 SQL 中的文本文件中提取部分名称。文件名总是这样的:

AA_123456789_MoreText_MMDDYYYYHHMM.txt

我需要得到的是第一个和第二个下划线之间。这部分的字符长度不同。通常它们都是数字,但有时会包含一个字母。

关于在 SQL 中处理此问题的最佳方法有什么想法吗?

【问题讨论】:

  • 你需要看看SUBSTRINGCHARINDEX函数

标签: sql-server tsql ssms


【解决方案1】:

这是使用SUBSTRINGCHARINDEX 的一种方法:

SELECT SUBSTRING(filename,
                 CHARINDEX('_', filename) + 1,
                 CHARINDEX('_', filename, CHARINDEX('_', filename, 1)) - 2)
FROM yourTable;

Demo

用简单的英语,上面的子字符串操作表示取第一个下划线之后,第二个下划线之前的所有内容。

【讨论】:

    【解决方案2】:

    请尝试以下基于标记化的解决方案。

    这样你可以选择字符串中任意位置的任意标记。

    SQL

    -- DDL and sample data population, start
    DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, tokens VARCHAR(8000));
    INSERT INTO @tbl (tokens) VALUES
    ('AA_123456789_MoreText_MMDDYYYYHHMM.txt'),
    ('BB_770_MoreText_MMDDYYYYHHMM.xml');
    -- DDL and sample data population, end
    
    DECLARE @separator CHAR(1) = '_'
        , @position INT = 2;
    
    SELECT ID, tokens
        , c.value('(/root/r[sql:variable("@position")]/text())[1]', 'VARCHAR(MAX)') AS Token
    FROM @tbl
    CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' + 
            REPLACE(tokens, @separator, ']]></r><r><![CDATA[') + 
            ']]></r></root>' AS XML)) AS t(c);
    

    输出

    +----+----------------------------------------+-----------+
    | ID |                 tokens                 |   Token   |
    +----+----------------------------------------+-----------+
    |  1 | AA_123456789_MoreText_MMDDYYYYHHMM.txt | 123456789 |
    |  2 | BB_770_MoreText_MMDDYYYYHHMM.xml       |       770 |
    +----+----------------------------------------+-----------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-02
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 2015-07-02
      相关资源
      最近更新 更多