WHERE子句中的用例-数据参数Sql Server

WHERE子句中的用例-数据参数Sql Server,sql,sql-server,Sql,Sql Server,我试图验证这个示例,如果日期为null,则从另一个字段中选择一个日期。查询下方: SELECT * FROM OrderPublish OP INNER JOIN Advertising AD ON AD.IdOrderPublish = OP.IdOrderPublish INNER JOIN Client Cli ON Cli.IdClient = OP.IdClient LEFT JOIN AdvertisingIns

我试图验证这个示例,如果日期为null,则从另一个字段中选择一个日期。查询下方:

SELECT
    *
FROM
    OrderPublish OP
    INNER JOIN Advertising AD ON
        AD.IdOrderPublish = OP.IdOrderPublish
    INNER JOIN Client Cli ON
        Cli.IdClient = OP.IdClient
    LEFT JOIN AdvertisingInserted AII ON
        AD.IdAdvertisingInserted = AII.IdAdvertisingInserted
    LEFT JOIN TypeProduct TP ON
        AII.IdTypeProduct = TP.IdTypeProduct
    INNER JOIN Publication PUB ON
        PUB.IdAdvertisingInserted = AII.IdAdvertisingInserted
WHERE
    TP.IdTypeProduct in (5,7)
    AND CASE WHEN PUB.DtIni IS NULL
        THEN
            OP.DtInc >= Isnull('08/18/2013', OP.DtInc)
        ELSE
            PUB.DtIni >= Isnull('08/18/2013', PUB.DtIni)
        END
    AND CASE PUB.DtFinal WHEN NULL
        THEN
            OP.DtInc <= Isnull('08/23/2013', OP.DtInc)
        ELSE
            PUB.DtFinal <= Isnull('08/23/2013', PUB.DtFinal)
        END
选择
*
从…起
订单发布操作
内联广告
AD.IdOrderPublish=OP.IdOrderPublish
上的内部连接客户端Cli
Cli.IdClient=OP.IdClient
左侧加入广告全部打开
AD.IdAdvertisingInserted=AII.IdAdvertisingInserted
左连接类型产品TP ON
AII.IdTypeProduct=TP.IdTypeProduct
上的内部联接发布发布发布
PUB.IdAdvertisingInserted=AII.IdAdvertisingInserted
哪里
TP.IdTypeProduct in(5,7)
以及PUB.DtIni为NULL时的大小写
然后
OP.DtInc>=Isnull('08/18/2013',OP.DtInc)
其他的
PUB.DtIni>=Isnull('08/18/2013',PUB.DtIni)
结束
如果为NULL,则为CASE PUB.DtFinal
然后

OP.DtInc您可以在您的案例中使用
COALESCE()
,但是如果您想在
的WHERE
标准中使用
case
,您可以这样做。将匹配条件移到
CASE
语句之外,您需要
CASE
语句返回要比较的值,而不是比较本身。这需要将每个
案例
语句加倍:

SELECT
    *
FROM
    OrderPublish OP
    INNER JOIN Advertising AD ON
        AD.IdOrderPublish = OP.IdOrderPublish
    INNER JOIN Client Cli ON
        Cli.IdClient = OP.IdClient
    LEFT JOIN AdvertisingInserted AII ON
        AD.IdAdvertisingInserted = AII.IdAdvertisingInserted
    LEFT JOIN TypeProduct TP ON
        AII.IdTypeProduct = TP.IdTypeProduct
    INNER JOIN Publication PUB ON
        PUB.IdAdvertisingInserted = AII.IdAdvertisingInserted
WHERE
    TP.IdTypeProduct in (5,7)
    AND CASE WHEN PUB.DtIni IS NULL
        THEN
            OP.DtInc
        ELSE
            PUB.DtIni 
        END
    >=  CASE WHEN PUB.DtIni IS NULL
        THEN
            Isnull('08/18/2013', OP.DtInc)
        ELSE
            Isnull('08/18/2013', PUB.DtIni)
        END

    AND CASE PUB.DtFinal WHEN NULL
        THEN
            OP.DtInc 
        ELSE
            PUB.DtFinal 
        END
    <= CASE PUB.DtFinal WHEN NULL
        THEN
            Isnull('08/23/2013', OP.DtInc)
        ELSE
            Isnull('08/23/2013', PUB.DtFinal)
        END    
选择
*
从…起
订单发布操作
内联广告
AD.IdOrderPublish=OP.IdOrderPublish
上的内部连接客户端Cli
Cli.IdClient=OP.IdClient
左侧加入广告全部打开
AD.IdAdvertisingInserted=AII.IdAdvertisingInserted
左连接类型产品TP ON
AII.IdTypeProduct=TP.IdTypeProduct
上的内部联接发布发布发布
PUB.IdAdvertisingInserted=AII.IdAdvertisingInserted
哪里
TP.IdTypeProduct in(5,7)
以及PUB.DtIni为NULL时的大小写
然后
OP.DTC公司
其他的
德蒂尼酒店
结束
>=PUB.DtIni为NULL时的大小写
然后
Isnull('08/18/2013',OP.DtInc)
其他的
Isnull('08/18/2013',发布日期)
结束
如果为NULL,则为CASE PUB.DtFinal
然后
OP.DTC公司
其他的
酒吧决赛
结束

您可以尝试使用合并函数,而不是case:

选择
*
从…起
订单发布操作
内联广告
AD.IdOrderPublish=OP.IdOrderPublish
上的内部连接客户端Cli
Cli.IdClient=OP.IdClient
左侧加入广告全部打开
AD.IdAdvertisingInserted=AII.IdAdvertisingInserted
左连接类型产品TP ON
AII.IdTypeProduct=TP.IdTypeProduct
上的内部联接发布发布发布
PUB.IdAdvertisingInserted=AII.IdAdvertisingInserted
哪里
TP.IdTypeProduct in(5,7)
和合并(PUB.DtIni,OP.DtInc)>=Isnull('08/18/2013',OP.DtInc)
和Coalesce(PUB.DtFinal,OP.DtInc)亲爱的,如果在同一AII表上使用内部联接时,AII为null(左外部联接失败),则会丢失行。你确定吗?
SELECT
    *
FROM
    OrderPublish OP
    INNER JOIN Advertising AD ON
        AD.IdOrderPublish = OP.IdOrderPublish
    INNER JOIN Client Cli ON
        Cli.IdClient = OP.IdClient
    LEFT JOIN AdvertisingInserted AII ON
        AD.IdAdvertisingInserted = AII.IdAdvertisingInserted
    LEFT JOIN TypeProduct TP ON
        AII.IdTypeProduct = TP.IdTypeProduct
    INNER JOIN Publication PUB ON
        PUB.IdAdvertisingInserted = AII.IdAdvertisingInserted
WHERE
    TP.IdTypeProduct in (5,7)
    AND Coalesce(PUB.DtIni,OP.DtInc)>= Isnull('08/18/2013', OP.DtInc)
    AND Coalesce(PUB.DtFinal,OP.DtInc)<= Isnull('08/23/2013', OP.DtInc)