我将标识存储在varbinary(max)字段中。我正在寻找的是说,一个SQL语句,有条件的SQL where子句
select logo where customerid=5
但如果特定客户ID标识为NULL,那么,
select logo where customerid=18
这是默认的标志。如果可能,我想在单个查询中执行此操作。这可以做到吗?谢谢。
我将标识存储在varbinary(max)字段中。我正在寻找的是说,一个SQL语句,有条件的SQL where子句
select logo where customerid=5
但如果特定客户ID标识为NULL,那么,
select logo where customerid=18
这是默认的标志。如果可能,我想在单个查询中执行此操作。这可以做到吗?谢谢。
SELECT COALESCE(b.logo, dflt.logo) AS logo
FROM mytable dflt
LEFT OUTER JOIN mytable b ON b.customerid=5
WHERE dflt.customerid=18
我认为我们的答案都能奏效,但我很想知道我们哪个答案表现更好......一方面,我对加入表示怀疑。另一方面,我喜欢使用coalesce,我不确定我的IN()+ ORDER BY CASE会更好,尤其是那些不适合索引但适合连接的条件。 –
此外,你的移动性更强,你不必在TOP 1,LIMIT 1等之间进行转换。 –
是的,我没有MS SQL Server,所以我无法测试哪个性能更好。如果customerid是主键(或集群键),那么我认为它会非常有效地匹配1或2行,所以任何一种解决方案都会很快。 –
SELECT TOP 1 logo
FROM [Table]
WHERE logo is not null and customerid IN (@CustomerID, 18)
ORDER BY CASE WHEN customerid= 18 THEN 1 ELSE 0 END
请注意我是如何处理订单的。我怀疑你可能有一些ID为< 18的客户和一些id> 18的客户,所以你需要在这里小心。
哪种数据库类型?这将改变答案 –
这是MSSQL,不确定为什么我的问题从“如果它为空”更改为“如果该customerid不存在”,customerid确实存在,但他们可能没有添加徽标,离开领域null – Greg
修复了您的编辑问题。 –