如何在 SQL Server 的交叉应用联接中指定列名

Posted

技术标签:

【中文标题】如何在 SQL Server 的交叉应用联接中指定列名【英文标题】:How to specify column names in cross apply join in SQL Server 【发布时间】:2019-07-11 04:38:49 【问题描述】:

我想知道我们如何在 Cross Apply Join 中提及列名并指定表名

已经在工作的查询:

select v.*, left(v.dir, charindex('/', v.dir) - 1) as dirname
from (values ('/Directory_A/Directory_B/Directory_C/Folder1/Folder2') ) t(path) cross apply
     (values (stuff(t.path, 1, len(t.path) - charindex(reverse('Directory_'), reverse(t.path)) + 1, ''))) v(dir)

预期查询:

select v.*, left(v.dir, charindex('/', v.dir) - 1) as dirname
from (values (“ColumnName”) ) t(path) cross apply
     (values (stuff(t.path, 1, len(t.path) - charindex(reverse('Directory_'), reverse(t.path)) + 1, ''))) v(dir) from table name

【问题讨论】:

您使用哪种数据库系统?甲骨文? SQL 服务器?后格雷斯?您能否将示例代码减少到绝对最小值? 使用您的预期输出添加示例数据。 我想取出最后一个目录 '/Directory_A/Directory_B/Directory_C/Folder1/Folder2' 的名称的结果,即 C,它与上述工作查询一样按预期出现。但我有一个要求,我需要对表格的特定列进行此操作 【参考方案1】:

它会为你工作

DECLARE @path VARCHAR(100)='/Directory_A/Directory_B/Directory_C/Folder1/Folder2'

SELECT SUBSTRING( @path,LEN(@path)-LEN(SUBSTRING(@path,PATINDEX('%folder%',@path), 100))-1, 1)

【讨论】:

【参考方案2】:

我认为您只需要表格参考:

select v.*, left(v.dir, charindex('/', v.dir) - 1) as dirname
from <tablename> tab cross apply
     (values (tab.ColumnName) ) t(path) cross apply
     (values (stuff(t.path, 1, len(t.path) - charindex(reverse('Directory_'), reverse(t.path)) + 1, ''))) v(dir) from table name

【讨论】:

以上是关于如何在 SQL Server 的交叉应用联接中指定列名的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server-交叉联接内部联接基础回顾

具有交叉联接反透视的 SQL Server

如何在表中指定基于 SQL Server 中另一列的计算列?

SQL的四种连接-左外连接右外连接内连接全连接

SQL的四种连接-左外连接右外连接内连接全连接

SQL的四种连接-左外连接右外连接内连接全连接