比较两个表,如果存在则显示另一个表的值,如果不存在,则在 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 JOIN
和COALESCE
任何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 join
。
select 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】:或者,在Table1
和Table2
和ISNULL
之间使用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 中显示状态的主要内容,如果未能解决你的问题,请参考以下文章
Postgres 如果不存在则插入多行,如果存在或插入则返回所有 id,然后使用所有 id 插入另一个表
如果表不存在,如何运行包含针对另一个 sql 实例上的表的查询的 If-Then-Else 语句?