2013-01-31 86 views
4

我将标识存储在varbinary(max)字段中。我正在寻找的是说,一个SQL语句,有条件的SQL where子句

select logo where customerid=5

但如果特定客户ID标识为NULL,那么,

select logo where customerid=18

这是默认的标志。如果可能,我想在单个查询中执行此操作。这可以做到吗?谢谢。

+1

哪种数据库类型?这将改变答案 –

+0

这是MSSQL,不确定为什么我的问题从“如果它为空”更改为“如果该customerid不存在”,customerid确实存在,但他们可能没有添加徽标,离开领域null – Greg

+0

修复了您的编辑问题。 –

回答

4
SELECT COALESCE(b.logo, dflt.logo) AS logo 
FROM mytable dflt 
LEFT OUTER JOIN mytable b ON b.customerid=5 
WHERE dflt.customerid=18 
+0

我认为我们的答案都能奏效,但我很想知道我们哪个答案表现更好......一方面,我对加入表示怀疑。另一方面,我喜欢使用coalesce,我不确定我的IN()+ ORDER BY CASE会更好,尤其是那些不适合索引但适合连接的条件。 –

+0

此外,你的移动性更强,你不必在TOP 1,LIMIT 1等之间进行转换。 –

+0

是的,我没有MS SQL Server,所以我无法测试哪个性能更好。如果customerid是主键(或集群键),那么我认为它会非常有效地匹配1或2行,所以任何一种解决方案都会很快。 –

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的客户,所以你需要在这里小心。

+0

这个工程!谢谢!我只是选择了这个,因为我还是不太了解联结,但是都要感谢。 – Greg

+2

用SQL编程而不理解连接就像在Java或C#或其他语言中编程而不理解循环。 –

+0

我知道,我一直在盯着你的解决方案半小时试图找出它,它也可以。 – Greg