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 

参考技术B select * from a where EXISTS(select id from b where a.相同的字段=b.相同的字段)

参考技术C 问题是什么? 参考技术D 疑问点:你整个的意图是什么?单单两张表的两个字段 ,T_A 表的 a 字段 在 T_B 表中 b 字段中是否存在?可以具体一些么? 至少 你可以说明 你想实现的思维意图是什么?追问

对,是你说的那样,我就是要判断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嵌套子查询判断的问题的主要内容,如果未能解决你的问题,请参考以下文章

select case when,用来判断查询

sql语句借助case when实现自动拼装where条件

oracle过程中查询语句where条件中带变量怎么实现?

mysql 查询某个字段并拼接case when出来的字段

sql2005中的case when语句怎么用啊?请写出一个常见的例子

SQL语句case when