收录日期:2021/01/26 17:53:42 时间:2016/07/12 06:44:38 标签:疑难问题
有表Table1 如下

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


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



2000?2005?
先将这个字符串分解一下。
变成
1001
1007
1009
2000 
的表形式,论坛分解字符串的代码多着。。

然后再JOIN一下
FROM tb AS A
    JOIN 分解的表 AS B
        ON CHARINDEX(','+B.Field+',',','+A.Field2+',')>0
看不明白
数据量小的情况下,可以这样吧.
select * from Table1 where Field2 like '%条件1%' or Field2 like '%条件2%' or Field2 like '%条件3%'.......

不知道是这意思不?
或者
select * from Table1 where Field2 like '%[条件1,条件2,条件3....]%'
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

但是结果不对

所以2楼的方法是查不出结果,我本地环境已经测试过了。2005的环境。
引用 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 


偶写的是用%号吗?
引用 7 楼 lxf2000104 的回复:
所以2楼的方法是查不出结果,我本地环境已经测试过了。2005的环境。


请不要乱用%号。
结合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)

结果就出来了
引用 9 楼 liangCK 的回复:
引用 7 楼 lxf2000104 的回复:
所以2楼的方法是查不出结果,我本地环境已经测试过了。2005的环境。 
 

请不要乱用%号。


我黏贴错了,但是结果也是一样的。就是我采用你的方案!
9楼可以自己去实验,确实查不出结果,我完全黏贴你的,替换我数据库里头的表名和字段。查不出数据
引用 12 楼 lxf2000104 的回复:
9楼可以自己去实验,确实查不出结果,我完全黏贴你的,替换我数据库里头的表名和字段。查不出数据


学会基础很重要。

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 行受影响)

*/
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

楼上技术不错,学习了!
''' union all select '''
' '' union all select '' '
多了个空格,学习。

新手问问:如何在红旗linux6下配置java和eclipse 请问sqlserver2008 加载脚本的方法有哪几种? VS2005使用注册控件在点击完创建用户后出现错误QQ:907292856 链表 怎么没有输出。 radclient执行权限不够如何解决 gdi+怎么显示32位ICO(带alpha通道) SQL简单查询语句 新手问问:如何在红旗linux6下配置mysql cantata++ vxworks 有什么办法能让一个网站 可以打开但是里面的内容访问不了 一个最简单的隐藏文件夹方法 急!! repeater问题 使用Area建立两个不同文件夹,存在相同的Controller,注册路由加上了命名空间参数,还是出错! easyui datagrid queryParams 购物车问题,仙人请进 请问 linux 是如何调用 alsa的控制接口的??是通过控制接口名字吗? javascript代码输出结果让人很迷惑!! 各位大大帮翻译几行代码 有木有可在.NET下使用的MathML组件?有木有!!!有木有!!! linux如何卸载rpm软件 【华夏纬讯】高薪诚聘C#程序员 海康的SDK Demo 谁有 sql查询 在线等 拜求:access用sql语句创建表时,可以怎么使得MEMO字段默认设置为rich text吗? MYECLIPSE 中TOMCAT服务器运行设置 能否动态修改include的layout 请问大家如何解决vs2010调试问题 新手问问:如何在红旗linux6下运行java 求助:新做的网站搜索条,在线看的话搜索条和按钮之间有空隙,本地看就没事 怎样判断1直插式14P芯片的型号?