SQL查询删除路径

SQL查询删除路径,sql,sql-server,Sql,Sql Server,我正在探索SQL的世界以及如何进行查询结果。我面临一个问题,我想在哪里显示节点路径,但没有前两个目录(文件夹)。我只是喜欢显示颜色,可以是从红色到蓝色到银色的任何颜色 示例 当前/Database/Connections/RED/Default/Database 想要红色吗 当前代码: FROM [Backbone_AKING].[dbo].[vw_CFGsvr] WHERE NodeName = 'Database' AND EnvironmentName IS NOT NULL O

我正在探索SQL的世界以及如何进行查询结果。我面临一个问题,我想在哪里显示节点路径,但没有前两个目录(文件夹)。我只是喜欢显示颜色,可以是从红色到蓝色到银色的任何颜色

示例

当前
/Database/Connections/RED/Default/Database
想要
红色吗


当前代码

FROM [Backbone_AKING].[dbo].[vw_CFGsvr]
WHERE NodeName = 'Database' AND EnvironmentName IS NOT NULL 
ORDER BY EnvironmentName asc

如果第一个目录始终相同,则可以使用
子字符串
功能:

SELECT SUBSTRING(NodePath, 22, LEN(NodePath) - 22)
FROM [Backbone_AKING].[dbo].[vw_CFGsvr]
WHERE NodeName = 'Database' AND EnvironmentName IS NOT NULL 
ORDER BY EnvironmentName asc

这将使您获得第三个位置,而不考虑任何节点的长度:

DECLARE @t TABLE (v VARCHAR(1000))

INSERT @t values ('/d/c/RED/d/dd'),('/dd/cc/SILVER/d/dd');

SELECT 
    REVERSE(LEFT(REVERSE(p3.s), CHARINDEX('/', REVERSE(p3.s))-1))
FROM @t
CROSS APPLY (SELECT LEFT(v, CHARINDEX('/',v, CHARINDEX('/', v, CHARINDEX('/', v, CHARINDEX('/', v)+1)+1)+1)-1)) as p3(s)
按照您的示例,它如下所示:

SELECT 
    REVERSE(LEFT(REVERSE(p3.s), CHARINDEX('/', REVERSE(p3.s))-1))
FROM [Backbone_AKING].dbo.vw_CFGsvr
CROSS APPLY (SELECT LEFT(NodePath, CHARINDEX('/',NodePath, CHARINDEX('/',NodePath, CHARINDEX('/', NodePath, CHARINDEX('/', NodePath)+1)+1)+1)-1)) as p3(s)    
WHERE NodeName = 'Database' AND EnvironmentName IS NOT NULL
ORDER BY EnvironmentName ASC
说明:交叉应用用于修剪第三个“/”之后的所有内容,包括“/”。然后我们将其反转,将反转字符串中第一个“/”后面的所有内容修剪掉,然后再次反转以获得结果:

RED
SILVER

还有其他方法可以做到这一点,老实说,我不确定它们是否优雅。您可以尝试将
交叉应用
拆分为更多的离散项。除了编写CLR函数来实现这一点之外,我认为您不会在SQL中找到一种优雅、简单的方法来实现这一点。SQL server字符串函数没有任何“第n次出现”或“按此字符拆分此字符串”的概念—CLR可以轻松做到这一点

我得到一个错误,子字符串需要3个参数,所以我添加了一个1:SELECT子字符串(NodePath,1,22)对不起-我已经编辑了这个示例。pastebin中的错误有不同的原因-也可能是在原始查询中。但是错误只是在添加子字符串function时开始发生的。我该怎么办?这里需要更多信息-你只是在寻找你提到的三种颜色吗?它总是第三个子节点吗?它总是倒数第三个子节点吗?我看到的模式是这是第三个目录。这不是因为颜色,我只是替换了原始文本,以使人类更容易阅读:D@DanField,所以我只需要删除除第三个目录以外的所有内容。谢谢您对@DanField的回答。但遗憾的是,当我运行您的代码时,我遇到了以下错误:这些错误意味着列名与您从中选择的视图/表不匹配。我如何修复此错误?对不起,我的当前代码有点丢失:取出第13行上的
选择
。将其替换为
(逗号)。您的代码中有一个select语句,没有FROM子句。我已经这样做了(替换为,),但结果与添加新代码行之前相同。我错过了一些你觉得呢?