1

リスト内の要素が別のリストにあるかどうかをチェックするwhere句を使用してSQLを記述しようとしています。最初のリストの各メンバーをチェックするのではなく、これを達成するためのより短い方法はありますか?

SELECT * from FOO
WHERE FOO.A IN ('2','3', '5', '7','11','13','17','19') OR
  FOO.B IN ('2','3', '5', '7','11','13','17','19') OR
  FOO.C IN ('2','3', '5', '7','11','13','17','19') OR
  FOO.D IN ('2','3', '5', '7','11','13','17','19') OR
  FOO.E IN ('2','3', '5', '7','11','13','17','19') OR
  FOO.F IN ('2','3', '5', '7','11','13','17','19')

それが単純化されたSQLです。

あまりにも濁った水にならないようにしていましたが、あなたが尋ねるので:

最終的にここでやろうとしていることは、さまざまな基準を満たす列を持つ FOO から行を選択することです。これらの基準は 2 番目のテーブル (BAR と呼びます) に格納されます。主に db、name、type が一致する必要があり、フラグは 1 である必要があります。BAR から IN リストを構築し、FOO を含む INFORMATION_SCHEMA.COLUMNS の列名と比較することを計画していました。

フー:

+--------+--------+---------+---------+--------+-------+
|   DB   | Name   | Type    | Col1    |  Col2  | Col3  |
+--------+--------+---------+---------+--------+-------+
|   4    | AC1    | LO      | 1       |  10    | 2     |
|   4    | AC1    | HI      | 2       |  20    | 4     |
|   1    | DC2    | HI-HI   | 11      |  5     | 2     |
|   1    | DC2    | HI      | 22      |  10    | 4     |
|   1    | DC2    | LO      | 33      |  15    | 6     |
+--------+--------+---------+---------+--------+-------+

バー:

+--------+--------+---------+---------+--------+
|   DB   | Name   | Type    | Field   |  Flag  |
+--------+--------+---------+---------+--------+
|   4    | AC1    | LO      | Col1    |  1     |
|   4    | AC1    | HI      | Col1    |  1     |
|   1    | DC2    | HI-HI   | Col1    |  1     |
|   1    | DC2    | HI      | Col1    |  1     |
|   1    | DC2    | LO      | Col1    |  1     |
|   4    | AC1    | LO      | Col2    |  0     |
|   4    | AC1    | HI      | Col2    |  0     |
|   1    | DC2    | LO      | Col2    |  0     |
|   1    | DC2    | HI-HI   | Col2    |  0     |
|   1    | DC2    | HI      | Col2    |  0     |
|   4    | AC1    | LO      | Col3    |  0     |
|   4    | AC1    | HI      | Col3    |  0     |
|   1    | DC2    | LO      | Col3    |  0     |
|   1    | DC2    | HI-HI   | Col3    |  0     |
|   1    | DC2    | HI      | Col3    |  0     |
+--------+--------+---------+---------+--------+
4

3 に答える 3

0

データで何をしたいのかは明確ではありませんが、SQL Server を使用しているため、UNPIVOT 関数を使用して、列を行に変換することをお勧めします。これcol1により、データのフィルター処理が容易になります。col2col3

select db, name, type, col, value
from foo
unpivot
(
  value
  for col in (Col1, Col2, Col3)
) unpiv;

SQL Fiddle with Demoを参照してください。これにより、次の形式のデータが得られます。

| DB | NAME |  TYPE |  COL | VALUE |
------------------------------------
|  4 |  AC1 |    LO | Col1 |     1 |
|  4 |  AC1 |    LO | Col2 |    10 |
|  4 |  AC1 |    LO | Col3 |     2 |
|  4 |  AC1 |    HI | Col1 |     2 |

が行形式になると、フィルターを適用したり、テーブルに結合したりするのが非常に簡単になりますBAR

于 2013-04-19T20:40:23.147 に答える