如何判断表中字段是否包含另一个字段的值?

时间:2021-01-21 15:05:01
各位大神,小弟初学sql想请教一个问题~~先谢谢大家啦~~
例如我有两个表:

表A:personal (人员表)

pid     name
1        aaa
2        bbb
3        ccc
4        ddd
5        eee
6        ffff
7        ggg

表B:metting (会议表,pidlist代表参加会议的人员,用“|”分隔)

bid    pidlist
1       |2|3|4|
2       |1|3|4|
3       |1|2|4|

我想要 列出表A中没有参加会议的人,sql语句应该如何写?

6 个解决方案

#1


可以試一下下面的sql


create table personal
(
pid int,
name varchar(5)
)

create table meeting
(
bid int,
pidlist varchar(20)
)

insert personal 
select 1,'aaa' union 
select 2,'bbb' union 
select 3,'ccc' union 
select 4,'ddd' union 
select 5,'eee' union 
select 6,'fff' union 
select 7,'ggg' 

insert meeting 
select 1,'|2|3|4|' union
select 2,'|1|3|4|' union 
select 3,'|1|2|4|' 

select * from meeting as a ,personal  as b 
where a.pidlist not like '%|'+cast(b.pid as varchar)+'|%'



使用charindex()也可以實現

#2


相当感谢~~~仔细研究一下

#3


如何判断表中字段是否包含另一个字段的值?

运行是上面的结果....

我只是想列出没有参加过任何会议的人的名单,这个结果不太对...

#4


 SELECT * FROM personal WHERE pid NOT IN
(select DISTINCT B.PID from meeting as a ,personal  as b 
where a.pidlist like '%|'+cast(b.pid as varchar)+'|%')

#5


照抄楼上的DDL.

create table personal
(
pid int,
name varchar(5)
)
 
create table meeting
(
bid int,
pidlist varchar(20)
)
 
insert personal 
select 1,'aaa' union 
select 2,'bbb' union 
select 3,'ccc' union 
select 4,'ddd' union 
select 5,'eee' union 
select 6,'fff' union 
select 7,'ggg' 
 
insert meeting 
select 1,'|2|3|4|' union
select 2,'|1|3|4|' union 
select 3,'|1|2|4|' 
 

SELECT * FROM personal p WHERE NOT EXISTS(SELECT 1 FROM meeting WHERE CHARINDEX(CAST(p.pid AS VARCHAR(20)),pidlist)>0)

 


另外建议不要这样保存pidlist,这样不仅无法使用索引,对于更的需求会造成更大的不变。 使用多对多的关系保存人员和会议,这种pidlist只需要在做报表时呈现就可以了。

#6


这个很好~~

#1


可以試一下下面的sql


create table personal
(
pid int,
name varchar(5)
)

create table meeting
(
bid int,
pidlist varchar(20)
)

insert personal 
select 1,'aaa' union 
select 2,'bbb' union 
select 3,'ccc' union 
select 4,'ddd' union 
select 5,'eee' union 
select 6,'fff' union 
select 7,'ggg' 

insert meeting 
select 1,'|2|3|4|' union
select 2,'|1|3|4|' union 
select 3,'|1|2|4|' 

select * from meeting as a ,personal  as b 
where a.pidlist not like '%|'+cast(b.pid as varchar)+'|%'



使用charindex()也可以實現

#2


相当感谢~~~仔细研究一下

#3


如何判断表中字段是否包含另一个字段的值?

运行是上面的结果....

我只是想列出没有参加过任何会议的人的名单,这个结果不太对...

#4


 SELECT * FROM personal WHERE pid NOT IN
(select DISTINCT B.PID from meeting as a ,personal  as b 
where a.pidlist like '%|'+cast(b.pid as varchar)+'|%')

#5


照抄楼上的DDL.

create table personal
(
pid int,
name varchar(5)
)
 
create table meeting
(
bid int,
pidlist varchar(20)
)
 
insert personal 
select 1,'aaa' union 
select 2,'bbb' union 
select 3,'ccc' union 
select 4,'ddd' union 
select 5,'eee' union 
select 6,'fff' union 
select 7,'ggg' 
 
insert meeting 
select 1,'|2|3|4|' union
select 2,'|1|3|4|' union 
select 3,'|1|2|4|' 
 

SELECT * FROM personal p WHERE NOT EXISTS(SELECT 1 FROM meeting WHERE CHARINDEX(CAST(p.pid AS VARCHAR(20)),pidlist)>0)

 


另外建议不要这样保存pidlist,这样不仅无法使用索引,对于更的需求会造成更大的不变。 使用多对多的关系保存人员和会议,这种pidlist只需要在做报表时呈现就可以了。

#6


这个很好~~