簡體   English   中英

SQL后備或C#數據表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM