从sql表中拉出特定的单词或短语

时间:2013-05-20 15:12:26

标签: sql

所以我正在编写一份报告,将所有版本的adobe acrobat pro整合到一个sql报告中。我遇到的问题是Adobe将其命名约定从版本更改为版本。有些显示'Adobe Acrobat 7.1.0 Professional',而其他显示'Adobe Acrobat 9 Pro'。我的问题是我可以在另一栏中显示该版本,但是是否可以只显示所有不同版本的“Adobe Acrobat Pro”并解析出#?

另外请原谅我,我仍然对整个SQL查询事情很新。但我已经做了很多挖掘,似乎找不到任何对我有用的东西。

提前致谢

斯科特

SELECT DISTINCT 
                      v_GS_ADD_REMOVE_PROGRAMS_5.DisplayName0 AS [Display Name], LEFT(v_GS_ADD_REMOVE_PROGRAMS_5.Version0, 1) AS Version, 
                      v_GS_ADD_REMOVE_PROGRAMS_5.Publisher0 AS Publisher, v_R_System_5.User_Name0 AS [User Name], 
                      v_R_System_5.Name0 AS [Computer Name], DATEDIFF(day, v_GS_WORKSTATION_STATUS_5.LastHWScan, GETDATE()) AS [Last Scan]
FROM         v_GS_ADD_REMOVE_PROGRAMS AS v_GS_ADD_REMOVE_PROGRAMS_5 INNER JOIN
                      v_R_System AS v_R_System_5 ON v_GS_ADD_REMOVE_PROGRAMS_5.ResourceID = v_R_System_5.ResourceID INNER JOIN
                      v_R_System_Valid AS v_R_System_Valid_5 ON v_R_System_5.ResourceID = v_R_System_Valid_5.ResourceID INNER JOIN
                      v_GS_WORKSTATION_STATUS AS v_GS_WORKSTATION_STATUS_5 ON 
                      v_R_System_5.ResourceID = v_GS_WORKSTATION_STATUS_5.ResourceID
WHERE     (v_GS_ADD_REMOVE_PROGRAMS_5.Publisher0 LIKE '%Adobe%') AND (v_GS_ADD_REMOVE_PROGRAMS_5.Version0 LIKE '7%') AND 
                      (v_GS_ADD_REMOVE_PROGRAMS_5.DisplayName0 LIKE '%Acrobat%Pro%') AND 
                      (NOT (v_GS_ADD_REMOVE_PROGRAMS_5.DisplayName0 LIKE '%Distiller%'))

1 个答案:

答案 0 :(得分:0)

您可以使用SQL执行此操作 - 取决于您的方言和权限,可能通过编写用户定义的函数或通过其他语言(例如,通过C#/ VB.NET在SQL Server上的CLR程序集)。我不确定你的用例是什么,但在我的一些SQL字符串操作案例中,用编译(或JIT编译)语言编写它在很大程度上提高了性能 - 然而它因逐个案例,并且更容易开始使用仅限SQL的解决方案:

这是我在SQL Server 2008R2中汇总的快速版本(虽然它应该在2005年运行):

create function dbo.fFuncName ( @in varchar(128) )
returns varchar(128)
as begin
    declare @out varchar(128)
    declare @i int
    declare @c char
    declare @len int
    declare @lastWasSpace bit
    set @out = ''
    set @i = 1
    set @len = len(@in)
    set @lastWasSpace = 1
    while @i <= @len begin
        set @c = substring(@in, @i, 1)
        set @i = @i + 1
        if @c >= '0' and @c <= '9' or @c = '.' continue
        if @c = ' ' and @lastWasSpace = 1 continue
        set @lastWasSpace = 0
        if @c = ' ' set @lastWasSpace = 1
        set @out = @out + @c
    end
    return rtrim(@out)
end

这将删除所有数字,句点和重复空格。你可以这样称呼它:

select dbo.fFuncName('Adobe Acrobat 9.0 Pro')

结果为Adobe Acrobat Pro

如果您需要提取版本号,您可以编写一个相反的函数 - 只保留数字和句点。

此外,由于您使用的是SQL Server 2005,因此您可以使用CLR程序集。如果您定期处理数千条记录,这真的是值得的。如果适用,请参阅here

请注意,如果您没有足够的权限,这两种解决方案都无法运行 - 如果您所在的公司足够大,可以以策略驱动的方式分离其报表编写者和DBA,则可能无法创建用户定义的函数,在这种情况下,如果没有DBA的帮助,你的问题会变得更加复杂。