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

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

/Example Folder/Example Subfolder/ Example File

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

Example Folder

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

【问题讨论】:

标签: sql sql-server ssms


【解决方案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)), '/', '')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-26
          • 1970-01-01
          • 2021-06-28
          • 2015-05-04
          相关资源
          最近更新 更多