是否有一种好的方式在SQL中表达,如果匹配了某一列,则选择特定行,否则选择更常规的行?类似于:
SELECT name FROM names
WHERE (colA = @colA OR colA = 'ALL')
如果存在特定记录,我希望它只返回该记录;如果找不到特定列匹配,则返回通用的“ALL”记录。COALESCE似乎类似于我要找的东西,但我不知道在这里如何使用语法。
是否有一种好的方式在SQL中表达,如果匹配了某一列,则选择特定行,否则选择更常规的行?类似于:
SELECT name FROM names
WHERE (colA = @colA OR colA = 'ALL')
如果存在特定记录,我希望它只返回该记录;如果找不到特定列匹配,则返回通用的“ALL”记录。COALESCE似乎类似于我要找的东西,但我不知道在这里如何使用语法。
@Blorgbeard的答案(使用top 1和order by)可能是最好的方法,但为了与众不同,您也可以使用子查询并排除不存在的内容:
SELECT name FROM names
WHERE (colA = @colA) OR (colA = 'ALL' AND NOT EXISTS(
SELECT name FROM names
WHERE colA = @colA))
colA != @colA
这一部分是多余的,它将返回与原始查询完全相同的结果集,对吗? - Blorgbeard这个查询虽然不太美观,但应该能满足你的需求:
SELECT TOP 1 name FROM names
WHERE (colA = @colA OR colA = 'ALL')
ORDER BY CASE WHEN colA='ALL' THEN 1 ELSE 0 END
编辑:对于多列,我认为你需要的是这个:
SELECT TOP 1 name FROM names
WHERE (colA = @colA AND colB = @colB) OR (colA = 'ALL')
ORDER BY CASE WHEN colA='ALL' THEN 1 ELSE 0 END
ALL
行,因此无需检查colB='ALL'
,而表的“键”是colA
和colB
组合 - 因此您不关心colA
匹配但colB
不匹配的行,例如。select
列表中。 - BlorgbeardcolA
和 colB
是一个联合主键吗?所以,你想要具有 colA=@colA AND colB=@colB
的行,或者如果不存在这样的行,则想要 ALL
行? - BlorgbeardCOALESCE函数在连接多个表时非常有用,可以按照特定顺序返回第一个非空值。
例如:
SELECT
TheID=COALESCE(Table1.TheID,Table2.TheID,NULL)
FROM
Table1
INNER JOIN Table2 ON Table1.TheID=Table2.TheID
除了您发布的示例之外,实现您所要求的另一种替代方法是设置可空参数,并仅在其具有值时进行匹配:
例如:
CREATE Test(@Param1 INT=NULL)
AS
SELECT
*
FROM
Table
WHERE
(@Param1 IS NULL OR IDField=@Param1)
SELECT
Calc=CASE WHEN Table2.IDField IS NULL THEN Table.Value ELSE 'ALL' END
FROM
Table
INNER JOIN Table Table2 ON Table2.IDField<>@Param1
WHERE
(Table.IDField=@Param1)
where ColA in (@colA, 'ALL')
,这样会更简洁一些。 - Blorgbeard