我需要从SQL中的文本文件中提取部分名称。文件名通常是这样的:
AA_123456789_MoreText_MMDDYYYYHHMM.txt
我需要得到的是在第一个和第二个下划线之间。这部分字符长度不同。通常都是数字,但有时也会包含一个字母。
在SQL中处理这个问题的最好方法是什么?这是使用SUBSTRING
和CHARINDEX
的一种方法:
SELECT SUBSTRING(filename,
CHARINDEX('_', filename) + 1,
CHARINDEX('_', filename, CHARINDEX('_', filename, 1)) - 2)
FROM yourTable;
演示简单来说,上面的子字符串操作表示取第一个下划线之后、第二个下划线之前的所有内容。
请尝试以下基于标记化的解决方案。
这样你可以在字符串的任何位置选择任何标记。
/p>-- 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 |
+----+----------------------------------------+-----------+