如何加入 table 结果有时会以 - 号开头?

How to Join to a table where the result can sometimes lead with a - sign?

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

这意味着当我想报告我们不再使用的旧产品以及有效产品时,根据状态,两个密钥 table 之间的 ID 不同。这意味着产品 table 中的活动产品与库存商品 table 的活动产品匹配,两者都显示为 647107376 但是当产品不再活动时 StockItem table 将显示为 647107376,但保存产品信息的 table 将显示为 -647107376

当我加入 table 以获取所需信息时,这对我来说是个问题。最初我的查询设置如下:

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 table 以 StockItemID 开头 [=] 19=]

因此,我认为最好使用 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。

在联接中使用 or 应该有效:

LEFT JOIN SBS.PUB.SopProduct SopProduct_0 
   ON SopProduct_0.StockItemID = StockItem_0.StockItemID
      OR
      SopProduct_0.StockItemID = CONCAT("-", StockItem_0.StockItemID)

您可能需要 cast concat 的结果为一个数字(如果 ID 存储为数字)。

或者您也可以使用 abs 函数(假设 ID 是数字):

LEFT JOIN SBS.PUB.SopProduct SopProduct_0 
   ON SopProduct_0.StockItemID = abs(StockItem_0.StockItemID)

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

ON StockItem_0.StockItemID = ABS(SopProduct_0.StockItemID)

另外比较简单的方法是:

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

请注意,非平等条件通常会减慢 JOIN 操作。