现在有两张表,相关的结构如下:(用的";"号是为了区别数据用的)id name arr1 arr2
101 A-001 1; 1;
102 A-002 1;2; 1;
103 A-003 3; 3;
104 A-004 4; 3;4;
id text1 text2
1 aaa;bbb; ccc;ddd;
2 eee;fff; ggg;hhh;假如现在只知道表二中的id号为1,现需要把表一中所包含有
id号为1的记录全部找出来.显示如下.表二id 表一id name arr1 arr2
1 101 A-001 1; 1;
1 102 A-002 1;2; 1;这样的SQL语句要怎么写的,谢谢,我想了N久了,还是想不出..
101 A-001 1; 1;
102 A-002 1;2; 1;
103 A-003 3; 3;
104 A-004 4; 3;4;
id text1 text2
1 aaa;bbb; ccc;ddd;
2 eee;fff; ggg;hhh;假如现在只知道表二中的id号为1,现需要把表一中所包含有
id号为1的记录全部找出来.显示如下.表二id 表一id name arr1 arr2
1 101 A-001 1; 1;
1 102 A-002 1;2; 1;这样的SQL语句要怎么写的,谢谢,我想了N久了,还是想不出..
or ';'+arr2 like '%;1;%'
表一.id as 表一id,
表一.name,
表一.arr1,
表一.arr2
from 表一,表二
where 表二.id=1 and
(
';'+表一.arr1 like '%;'+cast(表二.id as varchar)+';%'
or ';'+表一.arr2 like '%;'+cast(表二.id as varchar)+';%'
)
declare @t1 table(id int,name varchar(10),arr1 varchar(10),arr2 varchar(10))
insert @t1 select 101,'A-001','1;','1;'
union all select 102,'A-002','1;2;','1;'
union all select 103,'A-003','3;','3;'
union all select 104,'A-004','4;','3;4;'
declare @t2 table(id int,text1 varchar(20),text2 varchar(20))
insert @t2 select 1,'aaa;bbb;','ccc;ddd;'
union all select 2,'eee;fff;','ggg;hhh;'
--查看测试数据
select * from @t1
select * from @t2
--查看结果
select b.id,a.id,a.name,a.arr1,a.arr2
from @t1 a inner join @t2 b
on charindex(cast(b.id as varchar),a.arr1)>0 or charindex(cast(b.id as varchar),a.arr2)>0
where b.id=1
/*id id name arr1 arr2
----------- ----------- ---------- ---------- ----------
1 101 A-001 1; 1;
1 102 A-002 1;2; 1;(所影响的行数为 2 行)
*/
PATINDEX
返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。语法
PATINDEX ( '%pattern%' , expression ) 参数
pattern一个字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除外)。pattern 是短字符数据类型类别的表达式。expression一个表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别。返回类型
int注释
PATINDEX 对 text 数据类型很有用;除 IS NULL、IS NOT NULL 和 LIKE(这些是 WHERE 子句中对 text 类型有效的仅有的其它比较运算)外,PATINDEX 也可用于 WHERE 子句中。如果 pattern 或 expression 为 NULL,则当数据库的兼容级别为 70 时 PATINDEX 返回 NULL;如果数据库兼容级别为 65 或更靠前,则仅当 pattern 和 expression 同时为 NULL 时,PATINDEX 返回 NULL。示例
A. 在 PATINDEX 中使用模式
本示例查找模式"wonderful"在 titles 表中 notes 列的某一特定行中的开始位置。USE pubs
GO
SELECT PATINDEX('%wonderful%', notes)
FROM titles
WHERE title_id = 'TC3218'
GO下面是结果集:-----------
46 (1 row(s) affected)
sqlb = "select * from product where arr1 like ';%" & newid1 & ";%'"
是哪里出错了?谢谢.
如果去掉";"就可以了.但这样又不好,如果11;的数据,则也会被认为like '% 1 %'.
sqlb = "select * from product where arr1 like '%" & newid1 & "%'"
from 表一 a,表二 b
where charindex(';'+ltrim(str(b.id)),';'+a.arr1+a.arr2)>0 and b.id=1
sqlb = "select * from product where arr1 like ';%" & newid1 & ";%'"
是哪里出错了?谢谢.
如果去掉";"就可以了.但这样又不好,如果11;的数据,则也会被认为like '% 1 %'.
sqlb = "select * from product where arr1 like '%" & newid1 & "%'"
---------------------------------------------------------------------------
sqlb = "select * from product where arr1 like '%;" & newid1 & ";%'"
insert @t1 select 101,'A-001','1;','1;'
union all select 102,'A-002','11;2;','11;'
union all select 103,'A-003','3;','3;'
union all select 104,'A-004','4;','3;4;'
declare @t2 table(id int,text1 varchar(20),text2 varchar(20))
insert @t2 select 1,'aaa;bbb;','ccc;ddd;'
union all select 2,'eee;fff;','ggg;hhh;'
--select 1 as 表二id,* from @t1 where patindex(';1;%',';'+arr1)>0 or patindex(';1;%',';'+arr2)>0--select *from @t1
--select *from @t2select 1 as 表二id,* from @t1 a
where a.arr1 like ('1;%')or a.arr2 like ('1;%') or a.arr1 like (';1%')or a.arr2 like (';1%')
因为对like相对熟一点,所以还是想用like.
sqlb = "select * from product where arr1 like '%" & newid1 & "%'"
因为数据库的原因,现在数据库暂时为ACCESS.但是以上这样子也可以顺利执行.奇怪,如果加上";"号上去,就找不到纪录了:
sqlb = "select * from product where arr1 like '%;" & newid1 & ";%'"是哪里错了?
有没其它办法呢?
sqlb = "select * from product where arr1 like '%;" & newid1 & ";%'"
-------------------------------------------------------------------
sqlb = "select * from product where ';' + arr1 like '%;" & newid1 & ";%'"
是这样的,现在当表二的id等于1时,如果用";1;"的SQL语句来寻找表一中的arr1的纪录时就会为空,因为arr1里面的纪录是"1;",前面少了一个";".表一
id name arr1 arr2
101 A-001 1; 1;
102 A-002 1;2; 1;
103 A-003 3; 3;
104 A-004 4; 3;4;表二
id text1 text2
1 aaa;bbb; ccc;ddd;
2 eee;fff; ggg;hhh;
奇怪,这加个";"是什么意思啊.
非常感谢,真的.
sqlb = "select * from product where srotid=100 and ';' + arr1 like '%;" & newid1 & ";%' or ';' + arr2 like '%;" & newid1 & ";%'"