[英]SQL fallback or c# datatable
說我有十輛車
顏色,engine_size,類型,make ...等列,共有50列
我想選擇例如:
從所有顏色為50列的汽車中選擇*顏色='紅色'AND ENGINE_SIZE ='V8'且類型='轎跑車'和MAKE ='福特'的汽車...
但是...這就是我上周遇到的問題...我不希望整個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個條件
這是我第一次在這里發布文章,因此如果我對自己的解釋不夠好,我深表歉意。
您可以使用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”以賦予不同功能的權重。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.