【问题标题】:Oracle Database Link + Inner Join + To_Number QueryOracle 数据库链接 + 内连接 + To_Number 查询
【发布时间】:2017-01-17 14:06:45
【问题描述】:

数据库A - 表A - 字段A VARCHAR2
DatabaseB - TableB - FieldB NUMBER [dblink created]

SELECT *  
FROM TableB@dblink b  
INNER JOIN TableA a  
ON b.FieldB = a.FieldA  

有两种并发症。
1. FieldA 是VARCHAR2,但FieldB 是NUMBER
2. FieldA 包含-,FieldB 包含0

有关字段的更多信息
FieldAVARCHAR2(15)NOT NULL
样本值
-
123
没有非数字值,除了 -

字段BNUMBER(5,0)
样本值
0
123
没有非数字值

如果 FieldA='-' OR FieldB=0,我要做的是忽略行,否则将 FieldA 与 FieldB 进行比较。

SELECT *  
FROM TableB@dblink b  
JOIN TableA a  
  ON to_char(b.FieldB) = a.FieldA  

我收到以下错误:

SQL Error: 17410, SQLState: 08000
No more data to read from socket. 

【问题讨论】:

  • 我不清楚你的 NULL 值意味着什么。 TO_NUMBER(NULL) 返回NULL,那么需要以什么方式转换值与NULL 处理冲突?如果您提供示例输入、示例查询、实际结果和预期结果,也许会有所帮助...
  • 我想忽略 NULL 值,将它们从结果集中删除。
  • 重复您在问题中所写的内容既不能回答我的具体问题,也不能提供所要求的一般说明。如果由于某种原因您不能或不会提供示例输入、您尝试过的查询、实际结果以及它们与预期的差异......那么您需要找到一种不同的方式来明确您的请求。如果您需要我的帮助,不是重复;但也许其他人是更好的读心者。
  • 讽刺肯定有帮助。我非常愿意在这里提供意见,但是由于我的问题中包含了 2 个并发症,我无法提供意见。我无法克服这些错误,因为我不知道如何将 VARCHAR2 与 NUMBER 进行比较,同时还要考虑 NULL 值。
  • 这是你从一开始就遇到的错误吗?这似乎与 JDBC 有关——它可能与 SQL 查询本身没有任何关系。您是否在网络上(或其他)对其进行了一些研究?如果尚未在 SO 上提出和回答类似问题,我会感到震惊。

标签: oracle inner-join varchar2 database-link


【解决方案1】:
  1. NULL 永远不会与 equals 匹配,因此您的连接已经解决了这个问题。
  2. 您将获得(可能)NUMBER 到 VARCHAR 的隐式类型转换,因此也应该注意这一点。

话虽如此,我非常支持不依赖隐式数据类型转换。所以我会把我的查询写成

SELECT *  
FROM TableB@dblink b  
JOIN TableA a  
  ON to_char(b.FieldB) = a.FieldA  

如果这没有给出您想要的结果,也许在每个表中发布数据示例以及您想要的结果会有所帮助。

【讨论】:

  • 我提供了有关问题中数据的更多详细信息。
猜你喜欢
  • 2018-08-20
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多