1

WHERE 句のステートメントを呼び出し可能な変数として格納する方法はありますか?

異なる「日付」と「ID」の値を使用して、以下のクエリを約 20 回実行する必要がありますが、「コード」の値は同じままです。ただし、20 回のクエリの後、「コード」の値を別の値のセットに変更し、同じ 20 個の「日付」と「ID」の組み合わせを使用する必要があります。

SQL Server Management Studio 2012 を使用しています。

編集:これは実際には、結果として得られるレコードの数をカウントするためのサブクエリです。各カウント クエリは追加のカウント クエリに結合されるため、すべてのクエリを一度に実行し、結果にカウントを含む 1 つの列を表示できます。各列が「コード」セットに固有の結果を含む Excel テーブルを作成する方法を知りたいのですが、まだ調べていません。

SELECT DISTINCT a,b,c
    FROM mytable
    WHERE     (Code BETWEEN '201' AND '205') OR (Code BETWEEN '211' AND '215') OR (Code BETWEEN '241' AND '245') OR (Code = '450')
          OR  (Code BETWEEN '381' AND '387') OR (Code BETWEEN '391' AND '397') OR (Code BETWEEN '401' AND '420') OR (Code BETWEEN '441' AND '444') 
          OR  (Code BETWEEN '358' AND '360') OR (Code BETWEEN '371' AND '937') OR (Code = '499')                 OR (Code BETWEEN '218' AND '239'))
         AND  (Date > '20101231' AND Date < '20120101')
         AND  (ID IN ('3','6','7'))

コードの値がどのように変化するか:

WHERE   (Code IN ('791','792'))
     OR (Code BETWEEN '801' AND '899')
     OR (Code BETWEEN '101' AND '125')
     OR (Code BETWEEN '401' AND '429')


WHERE   (Code BETWEEN '281' AND '749') OR Code = '2037'

他に 2 つの Code リストがあり、合計 5 つあり、BETWEEN、IN、および = ステートメントを含みます。役立つ場合はこれらも投稿できますが、上記と同じ宣言方法に従っています。

日付の値は、暦年または四半期のいずれかです。ID 値は、IN、NOT IN、または = のいずれかで指定されます。それらはすべて char、varchar、tinyint、または date です。

別の方法:コードを何度もコピー アンド ペーストして置き換えることもできますが、コーディング能力を向上させたいと考えています。また、検索と置換は単一行のみを読み取ります。WHERE 句など、複数の行に対して機能させることができません。正規表現について聞いたことがありますが、それらを使用して目的を実行する方法がわかりません。

助けてくれてありがとう!

4

3 に答える 3

3

これが数回手動で実行するだけのアドホック クエリである場合、これは見苦しいですが正しいものです。

これをある程度定期的に行う場合は、値を別のテーブルに格納できます。「minCode」と「maxCode」の 2 つの列を持つ「coderange」というテーブルを作成できます。次に、このクエリを次のように書き直します。

SELECT DISTINCT a,b,c
    FROM mytable m
      JOIN coderange c
    WHERE  Code Between c.minCode and c.maxCode
     AND  Date > '20101231' 
     AND Date < '20120101'
     AND  ID IN ('3','6','7');
于 2014-07-28T17:52:52.683 に答える
1

おそらく、正しい値で何度も呼び出されるパラメーター化されたストアド プロシージャを作成するでしょう。

いくつかのリンク:

他のいくつかのオプションは、動的 SQL を使用してこれを行うか、必要なクエリを作成して実行する基本的な .NET ラッパーを作成することです。

于 2014-07-28T17:55:24.773 に答える
0

このシナリオでは、変数テーブルを使用して、以下のようにコード値を格納します

ここでの @t テーブルは変数テーブル、つまりメモリ内テーブルですが、永続テーブルにすることもできます

テーブルにはキーと呼ばれる値が含まれ、キー列には、保存するコード範囲の各セットの整数が含まれます。

以下の例では、値 1 と 2 のセットを書き留めています。

declare @t TABLE 
(
key INT, FROM_code VARCHAR(10), TO_CODE VARCHAR(10)
)


insert into @T VALUES (1,'791','792')
insert into @T VALUES (1,'801','899')
insert into @T VALUES (1,'101','125')
insert into @T VALUES (1,'401','429')

Insert into @t values (2,'281','749')
Insert into @t values (2,'2037','2037')

ここで、where select ステートメントで次のように記述できます。

Declare @KEY INT
-- PASS key as input parameter to the stored procedure.
Set @key =1


SELECT distinct a,b,c
From <my_table> M
JOIN @T T
ON T.key = @key
WHERE m.code between from_code and to_code

2 回目の反復では、@key=1 を @key=2 に置き換えます。

于 2014-07-28T18:25:54.780 に答える