条件SQL where子句

条件SQL where子句,sql,sql-server,Sql,Sql Server,我正在varbinarymax字段中存储徽标。我在找一个SQL语句,它说 选择customerid=5的徽标 但是如果特定customerid的徽标为空 选择customerid=18的徽标 这是默认的徽标。如果可能的话,我想在一个查询中完成这项工作。这能做到吗?谢谢 SELECT TOP 1 logo FROM [Table] WHERE logo is not null and customerid IN (@CustomerID, 18) ORDER BY CASE WHEN custom

我正在varbinarymax字段中存储徽标。我在找一个SQL语句,它说

选择customerid=5的徽标

但是如果特定customerid的徽标为空

选择customerid=18的徽标

这是默认的徽标。如果可能的话,我想在一个查询中完成这项工作。这能做到吗?谢谢

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的客户,因此在这里您需要小心。

哪种数据库类型?这会改变答案的,我不知道为什么我的问题会从如果为空改为如果customerid不存在,customerid确实存在,但他们可能没有添加徽标,字段为空。很抱歉,编辑不好,我误解了这个问题。我想我们的两个答案都有效,但我很想知道我们的答案中哪一个更好。。。一方面,我对加入持怀疑态度。另一方面,我喜欢使用coalesce,我不确定我的IN+ORDER BY CASE是否会更好,尤其是那些不适合索引的,但是你的连接条件可以。另外,你的连接条件更方便,你不必在TOP 1和LIMIT 1之间转换,等等。是的,我手边没有MS SQL Server,所以我无法测试哪个性能更好。如果customerid是主键或聚集键,那么我假设它将非常有效地匹配1或2行,因此这两种解决方案都会很快。这是有效的,我不知道如何连接不存在的表。是什么使b和dflt成为mytable的副本?b和dflt有时被称为表别名。这些不是表的副本—请将它们更像是mytable中某一行子集的标签。通过连接这些行,我们创建了一个新的虚拟行,该虚拟行来自并排排列的每个别名。这允许选择列表中的表达式引用每个别名中的一行。这很有效!非常感谢。我之所以选择这一个,是因为我仍然不太了解连接,但多亏了大家。在不了解连接的情况下使用SQL编程就像在不了解while循环的情况下使用Java或C或其他语言编程一样。我知道,我已经盯着你的解决方案看了半个小时,试图找出答案,它也很有效。
SELECT COALESCE(b.logo, dflt.logo) AS logo 
FROM mytable dflt
LEFT OUTER JOIN mytable b ON b.customerid=5
WHERE dflt.customerid=18