带条件的SQL查询

时间:2015-06-03 16:22:21

标签: sql sql-server conditional-statements

所以我的销售订单中的每个项目都有一个表格,其中包含商品ID或只是描述(如果它不是真实商品),表格如下所示:

SalesOrderLine:

|ID | SOI_IMA_RecordID | SOI_LineNbrTypeCode | SOI_MiscLineDescription |
|1  | 2                | Item                | XYZ                     |
|2  | NULL             | GL Acct             | Description             |
|3  | NULL             | GL Acct             | Descrip                 |
|4  | 20               | Item                | ABC                     |

我想要做的是,如果它不是真项(具有SOI_IMA_RecordID = NULL和/或SOI_LineNbrTypeCode = GL Acct)不与我的Item表内连接并获取SOI_MiscLineDescription而不是项目名称(IMA_ItemName in我的询问)。

我的查询如下:

SELECT  SOH_ModifiedDate,
        SOM_SalesOrderID,
        IMA_ItemName,
        SOH_SOD_RequiredDate,
        SOD_RequiredDate,
        SOH_SOD_DockDate,
        SOD_DockDate,
        SOH_SOD_PromiseDate,
        SOD_PromiseDate,
        SOH_SOD_RequiredQty,
        SOD_RequiredQty,
        SOH_SOD_UnitPrice,
        SOD_UnitPrice
    FROM        WSI_SOH            SOH
    INNER JOIN  SalesOrderDelivery SOD   ON SOH.SOH_SOD_RecordID = SOD.SOD_RecordID
    INNER JOIN  SalesOrder         SO    ON SO.SOM_RecordID      = SOD.SOD_SOM_RecordID
    INNER JOIN  SalesOrderLine     SOI   ON SOI.SOI_RecordID     = SOD.SOD_SOI_RecordID
    INNER JOIN  Item               ITE   ON ITE.IMA_RecordID     = SOI.SOI_IMA_RecordID

怎么做?

4 个答案:

答案 0 :(得分:2)

您可以在CASE中使用SELECT声明:

SELECT CASE WHEN SOI_IMA_RecordID IS NULL OR
                 SOI_LineNbrTypeCode = 'GL Acct'
            THEN SOI_MiscLineDescription
            ELSE IMA_ItemName
       END ItemName,
       -- ...
FROM        WSI_SOH            SOH
INNER JOIN  SalesOrderDelivery SOD   ON SOH.SOH_SOD_RecordID = SOD.SOD_RecordID
INNER JOIN  SalesOrder         SO    ON SO.SOM_RecordID      = SOD.SOD_SOM_RecordID
INNER JOIN  SalesOrderLine     SOI   ON SOI.SOI_RecordID     = SOD.SOD_SOI_RecordID
LEFT  JOIN  Item               ITE   ON ITE.IMA_RecordID     = SOI.SOI_IMA_RecordID AND
                                        SOI_IMA_RecordID IS NOT NULL AND
                                        SOI_LineNbrTypeCode != 'GL Acct'

答案 1 :(得分:0)

left join允许您在on条件匹配时加入,并且在不是的情况下仍然只显示联接右侧的列 - 在您的情况下,{ {1}}是SOI_IMA_RecordID

null

答案 2 :(得分:0)

将您的INNER JOIN更改为LEFT JOIN并使用CASE获取所需的值:

SELECT  SOH_ModifiedDate,
...
        CASE 
            WHEN IMA_ItemName IS NULL THEN SOI_MiscLineDescription 
            ELSE IMA_ItemName END AS ItemName,
...
FROM        WSI_SOH            SOH
...
LEFT JOIN Item ITE ON ITE.IMA_RecordID = SOI.SOI_IMA_RecordID AND SOI_IMA_RecordID IS NOT NULL

这样,只有匹配的记录才会加入Item表,当没有匹配的记录时,字段为NULL。当CASE表格不是Item时,NULL会从listSplit表中选择字段,否则会选择说明。

编辑 - 当我输入答案时,我看到有两个人在我面前!

答案 3 :(得分:0)

因为您在项目上使用了INNER JOIN,所以SalesOrderLine中没有相应ITE.IMA_RecordID的任何行都不会出现在您的最终查询中。

相反,对项使用LEFT JOIN,并使用确定要使用的描述的函数,或者只返回两列(SalesOrder Line中的描述和Item中的描述。)

我对SQL Server函数不太熟悉,但在PostGres和MySql中,这些函数就像COALESCE()(在字段列表中返回第一个非空值)

我相信你可能想在这里使用case语句,比如

case when item.description!=null 
then item.description 
else SalesOrderLine.SOI_MiscLineDescription 
end