前面一个比较复杂的过滤查询问题解决[多谢热心的老师们],现在来个个更加头痛的.有个表 下一字段为 ntext类型 规律是这样的 182,384,6556,134,5656,......,1234省略号中全部为数字. 用 ","[逗号分开的]我想提取出来成这样的.ID
182
384
6556
134
....
一共提取前10个.
另外如果老师们成功提取出来这些数字,就还有一个问题,另外一个表中也有这样的数字
GID
182
555
384
655
6556
....
也就是说 上面提取出来的ID是另外一个表GID的一个子集,那么又如何 在GID中,剥离出来于上面ID相同的 条目呢.谢谢各位老师们,帮忙解答.
182
384
6556
134
....
一共提取前10个.
另外如果老师们成功提取出来这些数字,就还有一个问题,另外一个表中也有这样的数字
GID
182
555
384
655
6556
....
也就是说 上面提取出来的ID是另外一个表GID的一个子集,那么又如何 在GID中,剥离出来于上面ID相同的 条目呢.谢谢各位老师们,帮忙解答.
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 行)
*/
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)
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,
FROM
dbo.PE_Keywords K
WHERE
K.KeywordText = 'aaa'
这样也不行那串数字就是从
SELECT
K.arrGeneralID
FROM
dbo.PE_Keywords K
WHERE
K.KeywordText = 'aaa'
这里得出来的.
haha.
(
@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
帮你晒晒,谢我吧
敬礼!--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
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
排列,搞了很久弄不出来.
FROM PE_CommonModel C
INNER JOIN PE_Keywords K
ON CHARINDEX(','+RTRIM(C.GeneralID)+',' , ',' + CAST(n AS NVARCHAR(100)) + ',' )>0
FROM PE_CommonModel C
INNER JOIN PE_Keywords K
ON CHARINDEX(','+RTRIM(C.GeneralID)+',' , ',' + CAST(n AS NVARCHAR(100)) + ',' )>0
我通过这样可以
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谢谢老师们的帮助.
。开个玩笑,不必如此吧,haha
指代我的表变量@t里的n列。你把它换成你的表中,ntext那个列的列名就可以了。
按照老师的方法 看到了曙光,已经查询出来.可是我想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为指定的一行,我该怎么加上这个限制,我怎么加怎么报错啊!
内放的二进制数据。
不能直接进行常规的操作。
先cast 为nvarchar.where cast(k.keywordtext as nvarchar(100))='aaa'但是这样,效率很差。如果数据量大,建议,在keyworrdtext上建立全文索引。ps:请勿“老师”的称呼,大家在这里只是交流。
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,就不能查询了...不过这个问题不是很大,我可以写两个标签调用,如果能实现那就是最好的了.
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 )
别当真呀
haha