接近SQL语句的替代方法如果不存在任何行,则显示全部

cga*_*ian 1 sql t-sql

想知道是否有人可能知道一个小的SQL脚本的技巧.

http://sqlfiddle.com/#!3/09638/3

我期待只返回有手动变速器的行并且是福特制造的.如果不存在任何行,则返回所有福特制造的车辆.我目前正在使用IF EXIST条件.我考虑使用临时表来存储第一组数据,然后查看表的rowcount()(插入行== 0)以查看是否需要插入更多数据.可能没有其他方法可以做到这一点,然后我描述了我的两个选项.也许社区对此有一些想法.

示例DDL

CREATE TABLE Cars
(
  Make varchar(50),
  Model varchar(50),
  ManualTransmission bit
);


INSERT INTO Cars
(Make, Model, ManualTransmission)
VALUES
('Ford', 'Taurus', 0),
('Ford', 'Contour', 0),
('Ford', 'Mustang', 0),
('Jeep', 'Liberty', 1),
('Jeep', 'Cherokee', 0);
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 6

单程

WITH CTE
     AS (SELECT *,
                RANK() OVER (ORDER BY ManualTransmission DESC) AS Rnk
         FROM   Cars
         WHERE  Make = 'Ford')
SELECT Make,
       Model,
       ManualTransmission
FROM   CTE
WHERE  Rnk = 1 
Run Code Online (Sandbox Code Playgroud)

或其他

SELECT TOP 1 WITH TIES Make,
                       Model,
                       ManualTransmission
FROM   Cars
WHERE  Make = 'Ford'
ORDER  BY ManualTransmission DESC 
Run Code Online (Sandbox Code Playgroud)

这两个答案都利用ManualTransmissionBIT数据类型的事实,并且1是它可以拥有的最大可能值.如果可以ManualTransmission为空,那么您需要将它们更改为

ORDER BY ISNULL(ManualTransmission,0) DESC
Run Code Online (Sandbox Code Playgroud)

要么

ORDER BY CASE WHEN ManualTransmission = 1 THEN 0 ELSE 1 END
Run Code Online (Sandbox Code Playgroud)

CASE版本还适用于更复杂的条件.