在 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 中的两个相同字符之间提取值的主要内容,如果未能解决你的问题,请参考以下文章