比较两个表,如果存在则显示另一个表的值,如果不存在,则在 SQL 中显示状态

Posted

技术标签:

【中文标题】比较两个表,如果存在则显示另一个表的值,如果不存在,则在 SQL 中显示状态【英文标题】:Compare two tables and show the value of another table if exist, if not exist just show status in SQL 【发布时间】:2019-09-09 06:09:13 【问题描述】:

我有两个要在 SQL 中比较的表。当一个中的id 存在于另一个中时,我想要的结果是第二个表中数据的值;当它不存在时,它会在“值”字段名称中显示“数据不存在”。

例子

表 1

| id|
-----
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10|

表 2

|id | value
---------
| 1 | 10|
| 2 | 9 |
| 3 | 7 |
| 4 | 8 |    
| 5 | 6 |

我试过下面的查询:

select a.id,
       CASE when exists(select a.id from table2 b where a.id = b.id)
            THEN value
            else 'Data Not Exist'
       END as Result_Value
from table1 a inner join table2 b 
on a.id=b.id
order by a.id;

结果是:

|id | Result_Value
---------
| 1 | 10|
| 2 | 9 |
| 3 | 7 |
| 4 | 8 |    
| 5 | 6 |

上面不是我想要的结果,我的期望结果如下:

|id | Result_Value
---------
| 1 | 10             |
| 2 | 9              |
| 3 | 7              |
| 4 | 8              |    
| 5 | 6              |
| 6 | Data Not Exist |
| 7 | Data Not Exist |
| 8 | Data Not Exist |
| 9 | Data Not Exist |
| 10| Data Not Exist |

注意:这是对我的查询的简单解释,因为我的查询很复杂,要使用内部连接连接另一个表,我不知道使用 select 存在我到底错在哪里。

【问题讨论】:

【参考方案1】:

只需使用LEFT JOINCOALESCE 任何NULL 值到Data not Exist

SELECT a.id, COALESCE(b.value, 'Data not exist') AS value
FROM a
LEFT JOIN b ON b.id = a.id

输出:

id  value
1   10
2   9
3   7
4   8
5   Data not exist
6   Data not exist
7   Data not exist
8   Data not exist
9   Data not exist
10  Data not exist

Demo on dbfiddle

【讨论】:

嗨尼克,你成功了。感谢您的询问。接近我想要的。但似乎“数据不存在”无法转换为浮点数,显示“将数据类型 varchar 转换为浮点数时出错”。 @agnanzakariya 没有看到您的整个查询和表结构,这很难确定,但您可能需要将值保留为 NULL,然后将 COALESCE 保留在查询的最顶部 解决错误,我将使用(b.value, '')。绰绰有余,再次感谢尼克 @agnanzakariya 很高兴你知道了。【参考方案2】:

我在这里发现了 2 个问题。

    如果您想显示下一张桌子,请不要使用 join/inner joinselect case 值的数据类型应该相同。

这是您的查询。

select a.id,
    case
    when isnull(b.id, '') != ''
        then cast(b.value as varchar(50))
    else
        'Data Not Exist'
    END as Result_Value
from table1 a 
left join table2 b on a.id=b.id
order by a.id;

【讨论】:

【参考方案3】:

或者,在Table1Table2ISNULL 之间使用LEFT JOIN 来检查NULL,如果NULL 则替换为Data not Exist

SELECT a.id, ISNULL(b.value,'Data not Exist') AS value FROM dbo.Table1 a 
LEFT JOIN dbo.Table2 b ON a.id=b.id

【讨论】:

【参考方案4】:

您可以通过使用带有以下之一的LEFT JOIN 长边来获得所需的结果:

COALESCE() 表达式。

ISNULL() 函数。

CASE 表达式。

IIF() 函数。

如下

SELECT T1.Id,
       COALESCE(CAST(T2.Value AS VARCHAR(10)), 'Data Not Exist') ByCoalesce,
       ISNULL(CAST(T2.Value AS VARCHAR(10)), 'Data Not Exist') ByIsNull,
       CASE WHEN T2.Value IS NULL
            THEN 'Data Not Exist'
            ELSE CAST(T2.Value AS VARCHAR(10))
       END ByCaseExpression,
       IIF(T2.Value IS NULL, 'Data Not Exist', CAST(T2.Value AS VARCHAR(10))) ByIifFunction
FROM
(
  VALUES
  (1),
  (2),
  (3),
  (4),
  (5),
  (6),
  (7),
  (8),
  (9),
  (10)
) T1(Id) LEFT JOIN
(
  VALUES
  (1, 10),
  (2, 9 ),
  (3, 7 ),
  (4, 8 ),    
  (5, 6 )
) T2(Id, Value)
ON T1.Id = T2.Id;

请注意,您需要将CAST() / CONVERT() INT 值设置为VARCHAR(n),因为VARCHAR 数据类型的precedence 低于INT 数据类型。

Online Demo

【讨论】:

以上是关于比较两个表,如果存在则显示另一个表的值,如果不存在,则在 SQL 中显示状态的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 如果不存在则插入,如果不存在则更新

创建将数据插入两个现有表的 SQL FUNCTION

Postgres 如果不存在则插入多行,如果存在或插入则返回所有 id,然后使用所有 id 插入另一个表

如果表不存在,如何运行包含针对另一个 sql 实例上的表的查询的 If-Then-Else 语句?

比较两个文件,如果文件 1 中存在字符串,则打印 2,如果不存在则打印 1

单链表交叉问题(单链表存在环的问题)