0

1 つは月、もう 1 つは年です。ユーザーは、取得するアイテムの送信月と年を選択します。データベースでは、日付は完全に入力されています。2009 年 1 月 12 日。ドロップダウン リストには「すべての年」と「すべての月」のオプションがありますが、ユーザーがいずれかを選択すると結果は null になります。どうもありがとう。これは私のクエリです:

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (YEAR(Submit) LIKE ISNULL(@YearPay, ''))
 AND (MONTH(Submit) LIKE ISNULL(@MonthPay, ''))

私のパラメータは次のとおりです。

<asp:ControlParameter ControlID="DropDownList1" DefaultValue="" Name="YearPay" PropertyName="SelectedValue" />

<asp:ControlParameter ControlID="DropDownList2" DefaultValue="" Name="MonthPay" PropertyName="SelectedValue" />

4

3 に答える 3

5

この問題を解決する 1 つの方法を次に示します。

 SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
 FROM Items 
 WHERE (YEAR(Submit) = @YearPay OR @YearPay IS NULL)
 AND (MONTH(Submit) = @MonthPay OR @MonthPay IS NULL)

そうすれば、いずれかの変数に NULL を渡すと、WHERE 句のその部分が true を返します。

于 2009-12-10T17:24:15.920 に答える
1

かなり簡単な方法の 1 つは、@YearPay と @MonthPay が INTEGER データ型であることを確認してから、(たとえば) -1 を渡して "ALL" を示すことです。クエリは次のようになります。

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (YEAR(Submit) = @YearPay OR @YearPay = -1)
 AND (MONTH(Submit) = @MonthPay OR @MonthPay = -1)

ただし、全体的なパフォーマンスのために、個人的には YEAR() と MONTH() を使用してこの方法を実行することは避けたいと思います。これは、インデックスの使用がうまくいかないためです。代わりに、日付範囲のみを受け入れるようにクエリを変更して、選択したドロップダウン項目に基づいて .NET コードによって to と from の日付が生成されるようにしたいと思います。

例えば

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (Submit >= @FromDate OR @FromDate IS NULL) 
    AND (Submit < @ToDate OR @ToDate IS NULL)

したがって、月/年の選択に次の例を使用します。
Jan 2009 は @FromDate = '2009-01-01' になります。@ToDate - '2009-02-01'
任意の月、2009 は @FromDate = '2009 になります。 -01-01', @ToDate = '2010-01-01'
任意の月、任意の年 = @FromDate = NULL、@ToDate = NULL

于 2009-12-10T17:27:38.583 に答える
0

これを試して

select * from sys.tables where name like ''

この

select * from sys.tables where name like '%%'

そうは言っても、私はNebakanezerのコメント(および解決策)に完全に同意します。

于 2009-12-10T17:30:26.940 に答える