Sql 如果行存在或不存在,如何将结果作为列值返回?
我有两张桌子。表一和表二Sql 如果行存在或不存在,如何将结果作为列值返回?,sql,postgresql,Sql,Postgresql,我有两张桌子。表一和表二 table1 - tID,title,description table2 - sID,tID,title,description 表1(t1)始终包含值。 在表2中(t2),如果存在一行,tID(外键)将始终与t1(主键)中的tID匹配 我想创建一个select语句,其中我从t1中选择所有列,并创建一个附加列“ex”,该列的值为true或false,具体取决于t2中是否有记录,其中tID匹配 Select t1.*, (some code) as ex from
table1 - tID,title,description
table2 - sID,tID,title,description
表1(t1)始终包含值。
在表2中(t2),如果存在一行,tID(外键)将始终与t1(主键)中的tID匹配
我想创建一个select语句,其中我从t1中选择所有列,并创建一个附加列“ex”,该列的值为true或false,具体取决于t2中是否有记录,其中tID匹配
Select t1.*, (some code) as ex from table1 t1,table2 t2;
明白吗?例如,如果从表1 t1、表2 t2中选择t1.*、t2.*,其中t1.tID=t2.tID
返回任何行,则ex同样应为true。。。我该怎么做
编辑:任何列都不能为空
编辑:忘了提及,我希望select语句仅在我指定的sID=someIdValue的地方匹配….使用
左连接
(外部连接),然后使用IS NULL
表达式检查表2中是否存在tID
Select t1.*, t2.tid is not null as ex
from table1 t1
left join table2 t2 on t1.tid = t2.tid
编辑:“如果我只想要sID与某个值匹配的值,该怎么办?”
Select t1.*,t2.tid作为ex不为空
来自表1 t1
在t1.tid=t2.tid和t2.sid=
使用左连接
(外部连接),然后使用IS NULL
表达式检查表2中是否存在tID
Select t1.*, t2.tid is not null as ex
from table1 t1
left join table2 t2 on t1.tid = t2.tid
编辑:“如果我只想要sID与某个值匹配的值,该怎么办?”
Select t1.*,t2.tid作为ex不为空
来自表1 t1
在t1.tid=t2.tid和t2.sid=
试试这个
select *, coalesce(tID = true, false) = true as is_exists from table1 t1
left join table2 t2 using (tid)
试试这个
select *, coalesce(tID = true, false) = true as is_exists from table1 t1
left join table2 t2 using (tid)
如果这对你有用,试试下面的一个
declare @T1 as Table
(
tId int,
title varchar(25),
description varchar(50)
)
declare @T2 as Table
(
sid int,
tId int,
title varchar(25),
description varchar(50)
)
insert into @t1 (tId,title,description) values(1,'abc','test')
insert into @t1 (tId,title,description) values(2,'abc','test')
insert into @t1 (tId,title,description) values(3,'abc','test')
insert into @t1 (tId,title,description) values(4,'abc','test')
insert into @t1 (tId,title,description) values(5,'abc','test')
insert into @t2 (tId,title,description) values(10,'abc','test')
insert into @t2 (tId,title,description) values(2,'abc','test')
insert into @t2 (tId,title,description) values(3,'abc','test')
insert into @t2 (tId,title,description) values(14,'abc','test')
insert into @t2 (tId,title,description) values(5,'abc','test')
Select distinct t1.*,
case when t2.tid is null then 'False' else 'True' end as ex from @T1 t1
left join @T2 t2
on t1.tId = t2.tId
输出
1 abc test False
2 abc test True
3 abc test True
4 abc test False
5 abc test True
如果这对你有用,试试下面的一个
declare @T1 as Table
(
tId int,
title varchar(25),
description varchar(50)
)
declare @T2 as Table
(
sid int,
tId int,
title varchar(25),
description varchar(50)
)
insert into @t1 (tId,title,description) values(1,'abc','test')
insert into @t1 (tId,title,description) values(2,'abc','test')
insert into @t1 (tId,title,description) values(3,'abc','test')
insert into @t1 (tId,title,description) values(4,'abc','test')
insert into @t1 (tId,title,description) values(5,'abc','test')
insert into @t2 (tId,title,description) values(10,'abc','test')
insert into @t2 (tId,title,description) values(2,'abc','test')
insert into @t2 (tId,title,description) values(3,'abc','test')
insert into @t2 (tId,title,description) values(14,'abc','test')
insert into @t2 (tId,title,description) values(5,'abc','test')
Select distinct t1.*,
case when t2.tid is null then 'False' else 'True' end as ex from @T1 t1
left join @T2 t2
on t1.tId = t2.tId
输出
1 abc test False
2 abc test True
3 abc test True
4 abc test False
5 abc test True
存在(子查询)
生成一个布尔值,您可以直接使用该值:
- 这将生成t1中的所有行,加上一个标志,指示t2中存在一个或多个对应行
- 如果只需要t2中具有匹配行的t1记录,请将
exists()
移动到where子句:
存在(子查询)
生成一个布尔值,您可以直接使用该值:
- 这将生成t1中的所有行,加上一个标志,指示t2中存在一个或多个对应行
- 如果只需要t2中具有匹配行的t1记录,请将
exists()
移动到where子句:
我不明白-如果值为null,我如何将其转换为true-false?另外,我的任何列都不能存储null,它们都必须有值。@KaizerSozay null是外部联接的产物。表达式t2.tid为null
如果tid
存在于table2
中,则返回true,否则返回false。如果我只想要sID与某个值匹配的值怎么办?@KaizerSozay逻辑被交换(如果有条目,则显示false),现在已经更正了。关于如何匹配sID有什么建议吗?我不明白-如果该值为null,如何将其转换为true-false?另外,我的任何列都不能存储null,它们都必须有值。@KaizerSozay null是外部联接的产物。表达式t2.tid为null
如果tid
存在于table2
中,则返回true,否则返回false。如果我只想要sID与某个值匹配的值怎么办?@KaizerSozay逻辑被交换(如果有条目,则显示false),现在已更正。是否有关于如何匹配sID的建议?如果tID在每个表中有不同的名称,我将如何修改您的语句?这不是很明显。这似乎不适用于postgresql。。。错误只是强调了错误keyword@KaizerSozay你说得对,把coalesce中的类型搞乱了,编辑有没有办法也匹配sID?@KaizerSozayleft join table 2 t2 on t1.t1id=t2.t2id
如果tID在每个表中有不同的名称,我该如何修改你的语句?这不是很明显。这似乎不适用于postgresql。。。错误只是强调了错误keyword@KaizerSozay你说得对,把所有人都搞砸了,编辑任何关于如何匹配sID的想法?@KaizerSozay左连接表2 t2 on t1.t1id=t2.t2id
声明@t1为表..
在postgres Sql中无效语法这些表仅用于示例,但逻辑相同声明@t1为表..
在postgres Sql中无效语法这些表仅用于但逻辑是一样的