color,engine_size,type,make ...等列有50列
我想选择例如:
所有50列的SELECT * FROM CARS WHERE COLOR ='red'AND ENGINE_SIZE ='V8'AND TYPE ='coupe'和MAKE ='Ford'等...
但......这就是我上周被困的地方...我不希望整个SELECT语句在条件不满足时返回空...我希望它回退到它的任何地方可以得到......
例如,如果它只找到红色的汽车并且是福特双门轿车但没有一辆是V8,那么我们希望它返回空的记录,而不是空的,我希望它返回红色和轿跑车和福特的记录......我必须这样做所有50列......
在尝试和谷歌搜索一周后,我意识到SQL无法动态改变自己...你做了一个SELECT语句然后它就会关闭并运行它......它没有办法好好去那部分该语句返回为空,所以我会回到那个有用的位......
所以现在我认为我需要用c#来做它并编写一些可怕的代码,这些代码一遍又一遍地迭代遍历数据表,逐渐减少它直到它能够找到它所能找到的东西。
这似乎并不优雅,我想知道是否有更好的方法?我没有发布我的任何示例代码,因为我尝试过的任何东西(ISNULL,IF EXISTS等)都做了我想要实现的任何事情。我什么也没回来。
简化我对psuedocode的说法:
如果结果!=空
选择*其中Color ='red'和Type ='coupe'和Make ='Ford'等(适用于50个条件)
否则
选择*其中Color ='red'和Type ='coupe'和Make ='Ford'等(适用于49个条件)
...等
但即使这样也会失败,因为我必须测试这50个条件的每一种可能的组合......不仅仅是50个一个接一个
这是我第一次在这里发帖,所以如果我没有很好地解释自己,我会道歉。
答案 0 :(得分:0)
您可以使用order by
代替where
:
select top 1 c.*
from cars c
order by ((case when Color = 'red' then 1 else 0 end) +
(case when Type = 'coupe' then 1 else 0 end) +
(case when Make = 'Ford' then 1 else 0 end) +
. . .
) desc;
当然,您可以调整" 1"以对不同的功能进行加权。