如何加入 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
语句并在其中嵌套 concat
和 left
来得出结果,但这似乎也不起作用下面的连接示例:
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
操作。
希望我能解释清楚。我有一个独特的问题,我们使用的客户系统可以根据产品状态在后台更改数据库中的 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
语句并在其中嵌套 concat
和 left
来得出结果,但这似乎也不起作用下面的连接示例:
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
操作。