SQL查询语句SELECT中带有case when嵌套子查询判断的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL查询语句SELECT中带有case when嵌套子查询判断的问题相关的知识,希望对你有一定的参考价值。
这是我现在在项目中遇到的问题,有两个表a和b,用case when判断a表中的某一字段的每一个值在b表中的某一字段值中是否存在可以实现吗,我现在知道的是用“in”好像不行。各位高手帮帮忙啊,给个详细点的答案好吗?
1、创建两张测试表
create table test_case1(id number, value varchar2(200));
create table test_case2(id number, value varchar2(200));
2、先在表1中插入测试数据
insert into test_case1 values(1,'a');
insert into test_case1 values(2,'b');
insert into test_case1 values(3,'c');
insert into test_case1 values(4,'d');
insert into test_case1 values(5,'e');
commit;
3、在表2中插入数据
insert into test_case2 values(1,'aa');
insert into test_case2 values(2,'bb');
insert into test_case2 values(3,'cc');
insert into test_case2 values(6,'ee');
commit;
4、两表关联,并编写case when的语句
select t.*,
case when b.id is not null then '存在' else '不存在' end flag
from TEST_CASE1 t, TEST_CASE2 b
where t.id = b.id(+)
参考技术A判定A表的数据是否存在B表,如果存在则显示存在,不存在则显示不存在
例如S#存在于SC表和student表中,判定s#是否都在student表中存在存在则显示存在,不存在则显示不存在,具体如下:
from student
select s#,
case when s# in(select s# from sc) then '存在'
when s# not in( select s# from sc) then '不存在'
end
from student
对,是你说的那样,我就是要判断a表中a字段在b表中的b字段里存不存在,然后给它一个标示符flag我要用这个flag在后面的程序里判断
CASE WHEN SQL 查询在 else 中执行条件,即使第一个条件为真
【中文标题】CASE WHEN SQL 查询在 else 中执行条件,即使第一个条件为真【英文标题】:CASE WHEN SQL Query executes condition in else even if first condition is true 【发布时间】:2020-12-22 10:34:31 【问题描述】:我正在尝试检查表中是否存在数据。首先我检查表是否存在,然后我使用 SELECT 语句检查表是否为空
DECLARE @dataExists BIT = 0
SELECT
@dataExists = CASE
WHEN OBJECT_ID('TableName') IS NULL
THEN 0
ELSE CASE
WHEN EXISTS(SELECT 1 FROM TableName)
THEN 1
ELSE 0
END
END
SELECT @dataExists
如果 OBJECT_ID('TableName')
返回 NULL,我有这个不应该执行的查询 SELECT 1 FROM TableName
但这个查询继续并执行
SELECT 1 FROM TableName
这当然会引发错误
无效的对象名称表名
【问题讨论】:
基本上是dba.stackexchange.com/questions/43352/…的重复 【参考方案1】:尝试以下方法:
DECLARE @dataExists BIT = 0
IF OBJECT_ID('TableName') IS NOT NULL
BEGIN
SET @dataExists = (SELECT TOP 1 1 FROM TableName)
END
SELECT @dataExists
您遇到的错误是编译错误。因为它是一个单一的声明。 SQL Server 需要构建执行计划,如果表不存在,则不能这样做。
通过添加IF
,如果不满足条件,则不需要“编译”语句。
使用动态 SQL:
DECLARE @TableName SysName = 'TableName'
DECLARE @Sql NVARCHAR(MAX) = '
DECLARE @dataExists BIT = 0
IF OBJECT_ID('''+@TableName+''') IS NOT NULL
BEGIN
SET @dataExists = (SELECT TOP 1 1 FROM '+QUOTENAME(@TableName)+')
END
SELECT @dataExists
'
EXEC (@Sql)
【讨论】:
有没有办法使用动态SQL实现以上目标? 当然可以,但是为什么非动态 SQL 不够用呢?您是否需要使用动态 SQL?如果是这样,应该从一开始就提到这一点。 我怎样才能追加'??以上是关于SQL查询语句SELECT中带有case when嵌套子查询判断的问题的主要内容,如果未能解决你的问题,请参考以下文章