WHERE子句中的用例-数据参数Sql Server
我试图验证这个示例,如果日期为null,则从另一个字段中选择一个日期。查询下方: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
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)