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

时间:2013-01-07 20:22:08

标签: sql tsql

想知道是否有人知道小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);

4 个答案:

答案 0 :(得分: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 

或另一个

SELECT TOP 1 WITH TIES Make,
                       Model,
                       ManualTransmission
FROM   Cars
WHERE  Make = 'Ford'
ORDER  BY ManualTransmission DESC 

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

ORDER BY ISNULL(ManualTransmission,0) DESC

或者

ORDER BY CASE WHEN ManualTransmission = 1 THEN 0 ELSE 1 END

CASE版本也适用于更复杂的条件。

答案 1 :(得分:2)

试试这个:

select *
from (select *,
             max(cast(ManualTransmission as int)) over (partition by make) as hasManual
      from cars
      where make = 'Ford'
     ) t
where hasManual = 0 or ManualTransmission = 1

答案 2 :(得分:1)

我想我发现了一种相当便宜的方法? 它似乎更便宜,因为它不需要进行任何排序

;WITH CTE AS
(
    SELECT   *
            ,HasManual = SUM(CAST(ManualTransmission AS INT)) OVER (PARTITION BY Make)
    FROM Cars
)
SELECT Make, Model, ManualTransmission
FROM CTE 
WHERE   (Make = 'Ford' AND ManualTransmission = 1)
OR      (Make = 'Ford' AND HasManual = 0)

答案 3 :(得分:0)

您可以尝试以下方法:

SELECT * FROM Cars
 WHERE Make = COALESCE('Ford', Make)
   AND ManualTransmission = COALESCE(1,ManualTransmission)