条件SQL where子句

4
我将徽标存储在varbinary(max)字段中。 我正在寻找一条SQL语句,它说: select logo where customerid=5 但是,如果特定customerid的徽标为NULL,则: select logo where customerid=18 这是默认徽标。 如果可能的话,我想在单个查询中执行此操作。 可以吗? 谢谢。

1
哪种数据库类型?这将在一定程度上改变答案。 - Joel Coehoorn
这是 MSSQL,不确定为什么我的问题被改成了“如果该客户ID不存在”,该客户ID确实存在,但他们可能没有添加标志,导致该字段为空。 - Greg
抱歉编辑得不好,我误解了问题。 - John Kugelman
2个回答

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

我认为我们两个的答案都可以,但我很想知道哪一个的表现更好...一方面,我对连接持怀疑态度。另一方面,我喜欢使用coalesce,并且我不确定我的IN() + ORDER BY CASE是否更好,特别是因为它们与索引不兼容,而你的连接条件却可以。 - Joel Coehoorn
此外,你的代码更具可移植性,无需在 TOP 1、LIMIT 1 等之间进行转换。 - Joel Coehoorn
是的,我手头没有MS SQL Server,所以无法测试哪个更有效。如果customerid是主键(或聚集键),那么我认为它将非常高效地匹配1或2行,因此任何一种解决方案都会很快。 - Bill Karwin
这个可以运行,但我不明白如何连接不存在的表。是什么让b和dflt成为mytable的副本? - Greg
b和dflt有时被称为表别名。它们不是表的副本——可以将它们视为mytable中一些行的“标签”。通过连接这些行,我们创建了一个新的虚拟行,其中每个别名都排列在一起。这允许SELECT列表中的表达式引用来自每个别名的一行。 - Bill Karwin

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,因此在这里需要小心处理。

这个可行!谢谢!我选择这个是因为我还不太理解连接,但还是感谢大家。 - Greg
2
在SQL中编程而不理解连接就像在Java、C#或其他语言中编程而不理解while循环一样。 - Bill Karwin
我知道,我已经盯着你的解决方案半个小时了,试图弄清楚它是如何工作的,它确实有效。 - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接