【问题标题】:SQL join with different conditions不同条件的 SQL 连接
【发布时间】:2022-01-01 03:32:44
【问题描述】:

我想使用列 invoicenr 内部连接 ​​TableA 和 TableB。 nr 列在两个表上都有不同的格式 在表 A 中。列nr 始终具有三个位置或一个空值。 在 TableB 中,列 nr 有 1 或 2 个位置。

例如,如果我们在两个表上检查 invoice= 322 和 invoice= 234。 我必须在TableB上填写“0”或“00”才能等于职位数。

对于 TableA,当nr 为 null 或空值时,我想将其替换为 0 例如,如果我们在两个表上检查 invoice=123 和 invoice=567。

感谢您提供的任何帮助。

【问题讨论】:

  • 预期结果是什么?
  • "B 列在 TableA 的两个表上的格式不同" 那么它们的值就不同了。首先修复您的设计,然后担心加入。显然你应该在这里整理你的引用完整性并实现主键和外键。
  • 当您说列 B 时,我想您的意思是列 nr ?它们的数据类型不同,因此您无法安全地加入该列。就是这么简单。先把设计修好,这个问题就不存在了,也没有任何你保留这个错误设计以后还会遇到的问题
  • 一个workaround 为您的设计问题将在您加入之前将列nrtableA 转换为int,例如join TableB b on convert(int, a.nr) = b.nr。但这不是一个安全的解决方法,修复设计是最好的解决方案
  • 到目前为止您尝试过什么?您的加入目前是什么样的?请对查询进行初步破解,并向我们展示具体是什么让您绊倒。

标签: sql sql-server sql-server-2012


【解决方案1】:

TableA 的 nr 列可能是 VARCHAR 而不是数字类型。
所以 CAST 或 CONVERT 将其转换为与 TableB.nr 相同的类型(可能是 INT)

并使用COALESCEISNULL 将NULL 更改为0

SELECT 
  a.invoice
, b.nr
, a.name
FROM TableA a
INNER JOIN TableB b
  ON b.invoice = a.invoice 
 AND b.nr = ISNULL(CAST(a.nr AS INT), 0)

【讨论】:

  • @hana 谢谢。注意处理 NULL 的更新。无论如何,空字符串都会被强制转换为 0。
猜你喜欢
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2018-05-02
  • 2013-05-18
  • 2014-12-25
  • 2011-03-29
相关资源
最近更新 更多