【问题标题】:Getting id values from a column and then get value from another table从列中获取 id 值,然后从另一个表中获取值
【发布时间】:2013-07-18 06:12:29
【问题描述】:

我有一个用逗号分隔的列值

GoalTag:All Tags,TaskTag:All Tags,GoalId:All,TaskId:All,MaxGoal:5,MaxTask:5

如您所见,我有 6 个用逗号分隔的值,所以当我拆分时,第一个值将是

 GoalTag:All Tags

我如何通过调用表值函数来做到这一点(获取由逗号分隔的值)

Select * from dbo.CustomSplit((SELECT FilterNames FROM TblUserFilterView where UserId = 325 AND Entity = 'Dashboard'),',')

dbo.CustomSplit 的定义看起来像

ALTER FUNCTION [dbo].[CustomSplit](@String varchar(8000), @Delimiter char(1))     
returns @temptable TABLE (Items varchar(8000))     
as     
begin     
    declare @idx int     
    declare @slice varchar(8000)     

    select @idx = 1     
        if len(@String)<1 or @String is null  return     

    while @idx!= 0     
    begin     
        set @idx = charindex(@Delimiter,@String)     
        if @idx!=0     
            set @slice = left(@String,@idx - 1)     
        else     
            set @slice = @String     

        if(len(@slice)>0)
            insert into @temptable(Items) values(@slice)     

        set @String = right(@String,len(@String) - @idx)     
        if len(@String) = 0 break     
    end 
return     
end

现在我需要做的是,我需要获取":" 之后的值,即“所有标签”,它可能是一些其他记录的 id,假设它可能是“142”。我需要获取这个Id,然后从表中获取对应的值。

我该怎么做?

【问题讨论】:

    标签: sql sql-server-2008 split


    【解决方案1】:

    试试这个:

    SELECT Substring(s.items, 1 + Charindex ( ':', s.items), 
           Len(s.items) - Charindex (':', 
           s.items)) 
    FROM   (SELECT * 
           FROM   dbo.Customsplit((SELECT filternames 
                                FROM   tbluserfilterview 
                                WHERE  userid = 325 
                                       AND entity = 'Dashboard'), ',')) AS s 
    

    你可以创建另一个函数:

    CREATE FUNCTION [dbo].[Customsplit2](@string    VARCHAR(8000), 
                                        @Delimiter CHAR(1)) 
    returns VARCHAR(4000) 
    AS 
      BEGIN 
          DECLARE @result NVARCHAR(4000) 
          SELECT @result = Substring(@string, 1 + Charindex ( @Delimiter, @string), 
                                            Len(@string) - Charindex (@Delimiter, 
                                                           @string) 
                           ) 
          RETURN @result 
      END 
    

    并像这样使用它:

    SELECT [dbo].Customsplit2(s.items, ':') AS Tag 
    FROM   (SELECT * 
            FROM   dbo.Customsplit((SELECT filternames 
                                    FROM   tbluserfilterview 
                                    WHERE  userid = 325 
                                           AND entity = 'Dashboard'), ',')) AS s 
    

    【讨论】:

    • 是的,它给出了正确的值,但作为一行单独的记录;除此之外,我需要它们一个一个并从表中获取相应的值。
    • (...)从表中获取相应的值,请在获得这些 ID 后通过解释流程中的后续步骤来编辑您的问题。
    • 谢谢;它对我有用。我会为下一步处理事情。
    • 不客气!当您的 SQL 代码中的事情变得过于复杂时,请记住您可以使用任何 .NET Framework 语言(包括 VB.NET 和 C#)编写自己的 CLR 函数。例如,您可以使用正则表达式模式来匹配搜索词。
    • 我明白了;以前我在后面的代码中这样做了..但是我们有一些速度问题,所以这就是为什么我试图直接从 db 获取值,这样会减少 db-trips...:)
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多