在 SQL 中的两个相同字符之间提取值

Posted

技术标签:

【中文标题】在 SQL 中的两个相同字符之间提取值【英文标题】:Extracting value in between two of the same characters in SQL 【发布时间】:2021-08-30 13:48:38 【问题描述】:

我有一个 nvarchar 列,它是一个文件路径。例如,值如下所示:

/Example Folder/Example Subfolder/ Example File

我想提取第一个目录名(所以对于这个例子,我只想:

Example Folder

关于如何在 SSMS 中最好地提取它有什么建议吗?

【问题讨论】:

这能回答你的问题吗? Using T-SQL, return nth delimited element from a string 【参考方案1】:
Declare @ColumnName nvarchar(300);
Set @ColumnName = '/Example Folder/Example Subfolder/ Example File'

Select SUBSTRING(@ColumnName,2,CHARINDEX('/',@ColumnName,2)-2) as [First Directory Name]

输出:

First Directory Name
----------------------
Example Folder

为了满足您的需求,请将@ColumnName 替换为表中的ColumnName,并将from tableName 添加到select 查询中。

【讨论】:

【参考方案2】:

请尝试以下通用方法。

它使用 XML 和 XQuery 来标记字符串。 XML/XQuery 数据模型基于有序序列。正是我们完成任务所需要的。

分隔符和标记的位置都是参数化的。因此,在任何位置检索任何令牌都很容易。

SQL

-- DDL and sample data population, start
DECLARE @tbl AS TABLE(ID INT IDENTITY PRIMARY KEY, tokens NVARCHAR(MAX));
INSERT INTO @tbl(tokens) VALUES 
('/Example Folder/Example Subfolder/Example File'),
('/SampleFolder/SampleSubfolder/SampleFile');
-- DDL and sample data population, end

DECLARE @separator CHAR(1) = '/'
   , @position INT = 1;

SELECT *
    , c.value('(/root/r[text()][sql:variable("@position")]/text())[1]', 'VARCHAR(256)') 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 | /Example Folder/Example Subfolder/Example File | Example Folder |
|  2 | /SampleFolder/SampleSubfolder/SampleFile       | SampleFolder   |
+----+------------------------------------------------+----------------+

【讨论】:

【参考方案3】:
SELECT SUBSTRING(columnname, 0 , CHARINDEX('/',columnname,2))
FROM tableName

db小提琴here

【讨论】:

【参考方案4】:

简单:

SELECT REPLACE(LEFT(folder, CHARINDEX('/', folder, 2)), '/', '')

【讨论】:

以上是关于在 SQL 中的两个相同字符之间提取值的主要内容,如果未能解决你的问题,请参考以下文章

提取以相同的两个字符开头并以数字字符结尾的文本

SQL Join 一对多从满足条件的相同键值组中提取值

sql 提取第一个字符

如何从具有相同类的页面中的两个表中提取数据?

使用子查询提取随机值每次都显示相同的值

如何在 PL/SQL 中使用 FOR LOOP 从具有相同标签的 xml clob 中提取值