前面一个比较复杂的过滤查询问题解决[多谢热心的老师们],现在来个个更加头痛的.有个表 下一字段为 ntext类型 规律是这样的 182,384,6556,134,5656,......,1234省略号中全部为数字. 用 ","[逗号分开的]我想提取出来成这样的.ID
182
384
6556
134
....
一共提取前10个.
另外如果老师们成功提取出来这些数字,就还有一个问题,另外一个表中也有这样的数字
GID
182
555
384
655
6556
....
也就是说 上面提取出来的ID是另外一个表GID的一个子集,那么又如何 在GID中,剥离出来于上面ID相同的 条目呢.谢谢各位老师们,帮忙解答.

解决方案 »

  1.   

    create table ta(id int,col text)
    insert ta select 1,'182,384,6556,134,5656,1234 '
    go--3.2.1 循环截取法
    CREATE FUNCTION f_splitSTR(
    @s   varchar(8000),   --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(20))
    AS
    BEGIN
    DECLARE @splitlen int
    SET @splitlen=LEN(@split+'a')-2
    WHILE CHARINDEX(@split,@s)>0
    BEGIN
    INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
    SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
    END
    INSERT @re VALUES(@s)
    RETURN
    END
    GOselect top 10  *
    from dbo.f_splitSTR('182,384,6556,134,5656,1234 ',',')
    drop table ta
    drop function f_splitSTR/*
    col                  
    -------------------- 
    182
    384
    6556
    134
    5656
    1234 (所影响的行数为 6 行)
    */
      

  2.   

    外一个表中(tb)也有这样的数字 
    GID 
    182 
    555 
    384 
    655 
    6556 
    .... 
    也就是说 上面提取出来的ID是另外一个表GID的一个子集,那么又如何 在GID中,剥离出来于上面ID相同的 条目呢---
    select top 10  *
    from dbo.f_splitSTR('182,384,6556,134,5656,1234 ',',') a
    where exists(select 1 from tb where a.id = gid)
      

  3.   

    老师可能是我表述不够详细我把
    select top 10  *
    from dbo.f_splitSTR(SELECT  K.arrGeneralID
    FROM
      dbo.PE_Keywords K
    WHERE
      K.KeywordText = 'aaa',',') a
    where exists(select 1 from tb where a.id = gid)改成这样查询不了了.
    因为上面的数字是我举例的,arrGeneralID 里面储存着不同的 xx,xxx,xxxx,xx,x,xx,
      

  4.   

    SELECT  ColorShower.f_splitSTR('K.arrGeneralID', ',')
    FROM
      dbo.PE_Keywords K
    WHERE
      K.KeywordText = 'aaa' 
    这样也不行那串数字就是从
    SELECT 
      K.arrGeneralID
    FROM
      dbo.PE_Keywords K
    WHERE
      K.KeywordText = 'aaa'
    这里得出来的.
      

  5.   

    这个split好像是我改良过的split.
    haha.
      

  6.   

    CREATE FUNCTION dbo.Split 
    (
    @ItemList VARCHAR(4000), 
    @delimiter VARCHAR(10)

    RETURNS @IDTable TABLE (Item VARCHAR(50)) AS
        BEGIN 
        WHILE CHARINDEX(@delimiter, @ItemList)>0
            BEGIN
                INSERT @IDTable SELECT LEFT(@ItemList,CHARINDEX(@delimiter,@ItemList)-1)
                SET @ItemList=STUFF(@ItemList,1,CHARINDEX(@delimiter,@ItemList),'')
            END
            INSERT @IDTable SELECT @ItemList
        RETURN    END
    GO
    DECLARE @t TABLE(n NTEXT)
    INSERT @t SELECT '12312,3423,3254125,11,22'
    UNION ALL SELECT '11,22,33'DECLARE @s NVARCHAR(4000)
    SELECT @s=ISNULL(@s+',','') + CAST(n AS NVARCHAR(100)) FROM @t
    --SELECT @sDECLARE @t1 TABLE (GID INT)
    INSERT @t1 SELECT 182
    UNION ALL  SELECT 555
    UNION ALL  SELECT 11
    UNION ALL SELECT  33SELECT DISTINCT a.* FROM @t1 a INNER JOIN dbo.Split(@s,',') b ON a.gid=b.item
    --以上使用split实现.而事实上,这个功能完全不必要使用splitSELECT DISTINCT a.* FROM @t1 a
    INNER JOIN 
    @t b
    ON CHARINDEX(','+RTRIM(gid)+',' , ',' + CAST(n AS NVARCHAR(100)) + ',')>0
    --或者使用like,或者使用patindex,略
    DROP FUNCTION Split
    GO
      

  7.   

    所以你是老师,呵呵
    帮你晒晒,谢我吧
    敬礼!--3.2.1 循环截取法---fcuandy 老师改良
    CREATE FUNCTION f_splitSTR(
    @s   varchar(8000),   --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(20))
    AS
    BEGIN
        DECLARE @splitlen int
        SET @splitlen=LEN(@split+'a')-2
        WHILE CHARINDEX(@split,@s)>0
        BEGIN
            INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
            SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
        END
        INSERT @re VALUES(@s)
        RETURN
    END
    GO
      

  8.   

    我对这个语句很感兴趣
    SELECT DISTINCT
     C.GeneralID
    FROM
    dbo.PE_CommonModel C
    INNER JOIN
     dbo.PE_Keywords K
     
     ON
     CHARINDEX(','+RTRIM(C.GeneralID)+',' , ',' + CAST(n AS NVARCHAR(100)) + ','
    我这样写不行SELECT 
      K.arrGeneralID
    FROM
      dbo.PE_Keywords K,
    WHERE
      K.KeywordText = 'aaa'
     才能查出来类似于 xxx,xxx,adsf,dfg,wer 的为ntext型另外一个表
    dbo.PE_Commonmodel 中GeneralID是 int信的 一列的向这样
    xxx
    xxx
    asdf
    dfg
    wer
    我想从GeneralID中 筛选出 在pe_keywords 的列表并以
    xxx
    xxx
    asdf
    dfg
    wer
    排列,搞了很久弄不出来.
      

  9.   

    SELECT DISTINCT C.GeneralID 
    FROM PE_CommonModel C 
    INNER JOIN PE_Keywords K 
    ON CHARINDEX(','+RTRIM(C.GeneralID)+',' , ',' + CAST(n AS NVARCHAR(100)) + ',' )>0
      

  10.   

    SELECT DISTINCT C.GeneralID  
    FROM PE_CommonModel C  
    INNER JOIN PE_Keywords K  
    ON CHARINDEX(','+RTRIM(C.GeneralID)+',' , ',' + CAST(n AS NVARCHAR(100)) + ',' )>0
      

  11.   

    我尝试按这样查询,n为无效列INNER JOIN PE_Keywords不行的,因为那串数字储存在 pe_keywords下的 arrGeneralID
    我通过这样可以
    SELECT  
      K.arrGeneralID 
    FROM 
      dbo.PE_Keywords K, 
    WHERE 
      K.KeywordText = 'aaa'
    可以取出
    name arrGeneralID
    aaa  3,4,6,5,7这里从pe_keywords下取出的3,4,6,5,7是ntext型 另外一个pe_commonmodel表下的一个"子集"
    我的意思是 pe_commonmodel表下 有GeneralID他是int型,这样储存的,如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11我是想通过pe_keywords的name字段为限定 也就是说限定了,arrGenralID的ntext数据.
    为限定 从pe_commonmodel中取出符合的 GeneralID谢谢老师们的帮助.
      

  12.   


    。开个玩笑,不必如此吧,haha
      

  13.   

    我在8楼写的 CAST(n AS NVARCHAR(100)) 
    指代我的表变量@t里的n列。你把它换成你的表中,ntext那个列的列名就可以了。
      

  14.   


    按照老师的方法 看到了曙光,已经查询出来.可是我想n换成ntext的列名,
    由于 ntext 有很多行.SELECT   
      K.arrGeneralID  
    FROM  
      dbo.PE_Keywords K,  
    WHERE  
      K.KeywordText = 'aaa' 
    可以取出 
    name arrGeneralID 
    aaa  3,4,6,5,7 
     
    如上面的我通过 K.KeywordText = 'aaa' 指定ntext为指定的一行,我该怎么加上这个限制,我怎么加怎么报错啊!
      

  15.   

    你的keywordText为ntext
    内放的二进制数据。
    不能直接进行常规的操作。
    先cast 为nvarchar.where cast(k.keywordtext as nvarchar(100))='aaa'但是这样,效率很差。如果数据量大,建议,在keyworrdtext上建立全文索引。ps:请勿“老师”的称呼,大家在这里只是交流。
      

  16.   

    最后的帮助SELECT ColorShower.F_LEWI(T.Keyword,2,'|')
    FROM PE_U_Article T
    WHERE
      T.ID = 4
    这条语句能够输出 aaa
    ------------------------------------------------------
    SELECT DISTINCT C.GeneralID FROM dbo.PE_CommonModel C
    INNER JOIN 
        PE_Keywords K
        ON CHARINDEX(','+RTRIM(C.GeneralID)+',' , ',' + CAST(K.arrGeneralID AS NVARCHAR(100)) + ',')>0 WHERE K.Keywordtext='aaa'
    ----------------------------------------------------
    问题基本上接近尾声了,激动中.第一条语句能够输出 给供第二条限定的字符串如上面的aaa如何连接?  我直接把第一条的语句复制到第二条的单引号中替换aaa,就不能查询了...不过这个问题不是很大,我可以写两个标签调用,如果能实现那就是最好的了.
      

  17.   

    从你的语义描述上来说,是这么写的。不知道你要取什么,所以不保证正确。
    SELECT DISTINCT C.GeneralID FROM dbo.PE_CommonModel C 
    INNER JOIN  
        PE_Keywords K 
        ON CHARINDEX(','+RTRIM(C.GeneralID)+',' , ',' + CAST(K.arrGeneralID AS NVARCHAR(100)) + ',')>0 WHERE K.Keywordtext=
    (SELECT TOP 1 ColorShower.F_LEWI(T.Keyword,2,' ¦') 
    FROM PE_U_Article T 
    WHERE 
      T.ID = 4 )
      

  18.   

    我这不也是在haha呀开玩笑的,
    别当真呀
    haha