首页 > 解决方案 > 如何加入到结果有时会以 - 符号开头的表?

问题描述

希望我能很好地解释这一点。我有一个独特的问题,我们使用的客户系统可以根据产品状态在后台更改数据库中的 ID。

这意味着当我想报告我们不再使用的旧产品以及活动产品时,两个关键表之间的 ID 会有所不同,具体取决于那里的状态。这意味着产品表中的活动产品与库存项目表中的活动产品匹配,两者都显示为,647107376但是当产品不再处于活动状态时,该StockItem表将显示为,647107376但包含 id 显示为的产品信息的表-647107376

当我将表格连接在一起以获取所需信息时,这对我来说是个问题。最初我的查询设置如下:

SELECT

Company_0.CoaCompanyName
,SopProduct_0.SopStiStockItemCode AS hbpref
,SopProduct_0.SopStiCustomerStockCode AS itemref
,SopProduct_0.SopDescription AS ldesc
,StockMovement_0.StmOriginatingEntityID AS Goodsin

FROM 
SBS.PUB.StockItem StockItem_0 
LEFT JOIN SBS.PUB.SopProduct SopProduct_0 ON StockItem_0.StockItemID = SopProduct_0.StockItemID
LEFT JOIN SBS.PUB.Company Company_0 ON SopProduct_0.CompanyID = Company_0.CompanyID
LEFT JOIN SBS.PUB.StockMovement StockMovement_0 ON StockItem_0.StockItemID = StockMovement_0.StockItemID

WHERE 

Company_0.CoaCompanyName = ?
AND StockMovement_0.MovementTypeID = '173355'
AND StockMovement_0.StmMovementDate >= ? AND StockMovement_0.StmMovementDate <= ?
AND StockMovement_0.StmQty <> 0
AND StockMovement_0.StockTypeID ='12049886'

不幸的是,尽管这意味着任何旧产品都不会显示,因为没有匹配的 id,因为SopProduct表格显示StockItemID了前导-

因此,我认为最好使用带有嵌套和其中的case when语句来显示结果,但这似乎不适用于下面的连接示例:concatleft

LEFT JOIN SBS.PUB.SopProduct SopProduct_0 ON (CASE WHEN LEFT(SopProduct_0.StockItemID,1) = "-" THEN CONCAT("-",StockItem_0.StockItemID) ELSE StockItem_0.StockItemID END) = SopProduct_0.StockItemID

其他人能想出解决这个问题的方法吗?我正在使用 Progress OpenEdge ODBC。

标签: mysqlsqlodbcopenedgeprogress-db

解决方案


数字看起来像数字。如果是,您可以使用abs()

ON StockItem_0.StockItemID = ABS(SopProduct_0.StockItemID)

否则一个相对简单的方法是:

ON StockItem_0.StockItemID IN (SopProduct_0.StockItemID, CONCAT('-', SopProduct_0.StockItemID))

请注意,不等式条件通常会减慢JOIN操作速度。


推荐阅读