如何在多级SQL查询中选择特定字符前的匹配文本

时间:2016-03-25 14:14:17

标签: sql sql-server

我有一个SQL Server 2008数据库,其中有2个表通过ID列连接 - 一个PRODUCTS表和一个REPORTS表。 REPORTS表有一个INCLUDED_FILES列,其TEXT数据类型包含一个文本块,如下例所示:

ikernel.dll|04/26/2002 06:48:38 PM|0||A||c:\program files\installshield 10.5\setup\build\ikernel.dll  
setup.dll|03/25/2002 04:11:12 PM|0||A||c:\program files\installshield 10.5\support\build\setup.dll  
setup.exe|06/28/1999 05:30:10 PM|0||A||c:\program files\installshield 10.5\support\build\setup.exe

我正在尝试使用通配符搜索此列以查找匹配的文件名,但我只想搜索到第一个“|”管道字符(并忽略字符串的其余部分)。

我目前有一个查询进行搜索,但我不知道如何仅搜索第一个管道 - 它搜索整个字符串。

select 
    t1.PATH, t1.VERSION, t1.NAME, t1.CREATION_DATE_DISPLAY, t1.CREATION_DATE
from 
    Products.dbo.PRODUCTS as t1
join 
    Products.dbo.REPORT_PATHS as t2 on (t1.REPORT_ID = t2.ID)
where 
    t2.INCLUDED_FILES like '%'+char(10)+'set%'+char(124)+'%';

然而,此查询将返回比预期更多的结果,因为它会在第一行文本中看到“setup”一词。

如何限制它只搜索第一个管道字符之前的文件名而不是整个字符串?

2 个答案:

答案 0 :(得分:1)

您可以使用CHARINDEX(以识别第一个管道符的位置)和SUBSTRING(仅使用第一个管道之前的字符串部分)来执行此操作。

答案 1 :(得分:0)

结合您需要的一切:

;with t2 As (
    Select *, CAST(INCLUDED_FILES AS VARCHAR(MAX)) As vfiles
    from Products.dbo.REPORT_PATHS
    )
select 
    t1.PATH, t1.VERSION, t1.NAME, t1.CREATION_DATE_DISPLAY, t1.CREATION_DATE
from 
    Products.dbo.PRODUCTS as t1
join 
    t2 on (t1.REPORT_ID = t2.ID)
where 
    LEFT(t2.vfiles, PATINDEX('%|%', t2.vfiles)) 
        like '%'+char(10)+'set%'+char(124)+'%'
;