*****请教一条查询语句******

dqk1985 2009-02-13 02:49:54
有表Table1 如下

Field1 Field2
A 1001,1002,1003,
B 1004,1005,1006
C 1003,1007,1008


现在有一串字符串是Field2 的条件 1001,1007,1009,2000
查询后,可以查询出第一条和第三条 第一条中1001 和条件中的 1001 对应 第三条中的1007 和条件中的1007对应 那么这条语句怎么写呢



...全文
93 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxf2000104 2009-02-13
  • 打赏
  • 举报
回复
''' union all select '''
' '' union all select '' '
多了个空格,学习。
lxf2000104 2009-02-13
  • 打赏
  • 举报
回复
DECLARE @t TABLE(Field1 VARCHAR(10),Field2 VARCHAR(20))
INSERT @t VALUES('A','1001,1002,1003')
INSERT @t VALUES('B','1004,1005,1006')
INSERT @t VALUES('C','1003,1007,1008')

create table #temptable(Field varchar(10) collate Chinese_PRC_CI_AS_WS)
declare @role varchar(100)
declare @sql varchar(8000)
set @role='1001,1007,1009,2000'
set @sql = replace(@role,',',''' union all select ''') --这里多了个空格,所以关联不到没有数据
set @sql = 'insert into #temptable select ''' + @sql + ''''
exec( @sql)

select a.* from @t a join #temptable b
ON CHARINDEX(B.Field,A.Field2)>0


drop table #temptable

楼上技术不错,学习了!
liangCK 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lxf2000104 的回复:]
9楼可以自己去实验,确实查不出结果,我完全黏贴你的,替换我数据库里头的表名和字段。查不出数据
[/Quote]

学会基础很重要。

DECLARE @t TABLE(Field1 VARCHAR(10),Field2 VARCHAR(20))
INSERT @t VALUES('A','1001,1002,1003')
INSERT @t VALUES('B','1004,1005,1006')
INSERT @t VALUES('C','1003,1007,1008')

DECLARE @str VARCHAR(20)
SET @str='1001,1007,1009,2000'

;WITH SplitStr AS
(
SELECT
B.x.value('.','varchar(10)') AS Field
FROM (
SELECT
CONVERT(XML,'<v>'+REPLACE(@str,',','</v><v>')+'</v>') AS v
) AS A
CROSS APPLY A.v.nodes('//v') AS B(x)
)
SELECT
A.*
FROM @t AS A
JOIN SplitStr AS B
ON CHARINDEX(','+B.Field+',',','+A.Field2+',')>0

/*
Field1 Field2
---------- --------------------
A 1001,1002,1003
C 1003,1007,1008

(2 行受影响)

*/
lxf2000104 2009-02-13
  • 打赏
  • 举报
回复
9楼可以自己去实验,确实查不出结果,我完全黏贴你的,替换我数据库里头的表名和字段。查不出数据
lxf2000104 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liangCK 的回复:]
引用 7 楼 lxf2000104 的回复:
所以2楼的方法是查不出结果,我本地环境已经测试过了。2005的环境。


请不要乱用%号。
[/Quote]

我黏贴错了,但是结果也是一样的。就是我采用你的方案!
lxf2000104 2009-02-13
  • 打赏
  • 举报
回复
结合4楼的方法,采用动态SQL的方式

declare @role varchar(100)
declare @sql varchar(8000)
set @role='0000,0005,0008'
set @sql = replace(@role,',','%'' union all select * from Table1 where Field2 like ''%')
set @sql = 'select * from Table1 where Field2 like ''%' + @sql + '%'''
exec( @sql)

结果就出来了
liangCK 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lxf2000104 的回复:]
所以2楼的方法是查不出结果,我本地环境已经测试过了。2005的环境。
[/Quote]

请不要乱用%号。
liangCK 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lxf2000104 的回复:]
FROM tb AS A
JOIN 分解的表 AS B
ON CHARINDEX(','+B.Field+',',','+A.Field2+',')>0


select * from Table1 a join #temptable b on
CHARINDEX('%'+b.code+'+%',Field2)> 0
[/Quote]

偶写的是用%号吗?
lxf2000104 2009-02-13
  • 打赏
  • 举报
回复
所以2楼的方法是查不出结果,我本地环境已经测试过了。2005的环境。
lxf2000104 2009-02-13
  • 打赏
  • 举报
回复
FROM tb AS A
JOIN 分解的表 AS B
ON CHARINDEX(','+B.Field+',',','+A.Field2+',')>0

结果还是不行。
先把以逗号分割的string 转化为表!
create table #temptable(code varchar(10) collate Chinese_PRC_CI_AS_WS)
declare @role varchar(100)
declare @sql varchar(8000)
set @role='0000,0005,0008'
set @sql = replace(@role,',',' '' union all select '' ')
set @sql = 'insert into #temptable select ''' + @sql + ''''
exec( @sql)

select * from Table1 a join #temptable b on
CHARINDEX('%'+b.code+'+%',Field2)> 0

但是结果不对

mydogs555 2009-02-13
  • 打赏
  • 举报
回复
或者
select * from Table1 where Field2 like '%[条件1,条件2,条件3....]%'
mydogs555 2009-02-13
  • 打赏
  • 举报
回复
数据量小的情况下,可以这样吧.
select * from Table1 where Field2 like '%条件1%' or Field2 like '%条件2%' or Field2 like '%条件3%'.......

不知道是这意思不?
「已注销」 2009-02-13
  • 打赏
  • 举报
回复
看不明白
liangCK 2009-02-13
  • 打赏
  • 举报
回复
先将这个字符串分解一下。
变成
1001
1007
1009
2000
的表形式,论坛分解字符串的代码多着。。

然后再JOIN一下
FROM tb AS A
JOIN 分解的表 AS B
ON CHARINDEX(','+B.Field+',',','+A.Field2+',')>0
liangCK 2009-02-13
  • 打赏
  • 举报
回复
2000?2005?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧