2017-11-19 15 views
0

は50列SQLのフォールバックまたはC#のデータテーブル

私は例えば選択したいがある、私は10台

色の列、engine_size、タイプ、作る...などを持っていると言います* COLOR = 'レッド'、ENGINE_SIZE = 'V8'、TYPE = 'クーペ'、MAKE = 'フォード'など... 5030列すべて...

...これはどこですか?先週は...条件が満たされていないときにSELECTステートメント全体が空に戻らないようにしたいと思います。それが得ることができるものは何でも...

たとえば、赤色でフォードクーペですが、V8でない場合は、空に戻ってくるのではなく、赤とクーペのレコードを返します。フォード...そして、私はすべての50の列のためにそれをしなければなりません...

私は一週間試してグーグルをした後、私はSQLがそれ自体を変更する方法がないことを知っている...あなたはSELECTステートメントを作成するそれは消えて、それを実行する...それは声明の一部が空に戻るので、私は仕事をしたビットに戻ります。 C#でそれを行い、反復し続けるひどいコードを書いてくださいそれが見つけられるまでそれを徐々に減らしていくデータテーブル。

これはエレガントではないようですが、より良い方法があるのでしょうか?私が試したことは何もなかったので(ISNULL、IF EXISTSなど)、私が達成したいことに近いものは何もしなかったので、私はサンプルコードを投稿していません。私は何もまたはすべてを戻しません。私は擬似コードと言っているものを簡単にするために

:!結果場合

=空

はのために(*どこ色=「赤」とタイプ=「クーペ」と= 'フォードなどを作る]を選択

選択*色= '赤' と... = 'クーペ' を入力して)

を= 'フォードなど(49の条件を作るなどの条件)他

が、私はこれが私の最初の時間はので、ここで私の謝罪を掲示されるだけではなく、50互いに

後...これらの50個の条件のすべての組み合わせをテストする必要があるためにも、これは失敗します」私の避難所であれば私は自分自身をとてもうまく説明しました。

+3

これは初めての投稿ですので、[ask]と[tour]を読んでください。 DB(またはSQL)は、あなたが必要とする優先順位を知ります。したがって、Datatableに最小値を選択すると、1つしか得られなくなるまで、より厳密な行フィルタが連続して適用されます。または1つ上のレベルをバックアップしないでください – Plutonix

+0

Plutonix井戸はい私はまたあなたの答えが50 * 50の可能な組み合わせをテストすることを意味し、私はそれをするつもりはないので、私はまた、質問をしている理由に達している結論です。私の後退の位置は、条件に優先順位をつけ、一つずつ一致しない行をすべて削除することです。私はちょうど私がそれをoverthinkingし、別の方法があり、はい私はルールを読んだが、私のサンプルコードが動作しないので、適用されないと私は何をしようとしているすべてのGoogleのリンクを発見していない達成するが、私はたくさんのグーグルグーグルをした... – Peter

答えて

0

かわりwhereorder byを使用することができます。

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」を調整することができます。

+0

優秀な私はあなたがそこでやっていることを参照してくださいはい、私はそれが動作する方法を参照してください。私はそれを試して、あなたに戻ってきます。ありがとうございました。 – Peter

+0

私はこれを理解しようとしましたが、私は運がなかった。これがどのように機能するか説明できますか? –

+0

@MohamedNajiullah。 。 。これは、一致する条件の数を数え、その結果を合計の一致数(最初のもの)で並べ替えます。 –

関連する問題