0

JavaScript などの言語では、2 つの条件ステートメントを使用して、最初のステートメントで 2 番目のステートメントを「保護」することができます。例えば:

if( scarryObject != null && scarryObject.scarryMethod() ) { ... }
// if scarryObject is null scarryMethod will not be called

私は次のようにSQLで同じことを達成すると思った:

where int_date > 19500101
    and month(CONVERT(smalldatetime, ... int_date))

ここでの問題は、int_date-1、0、1 などの「悪い」値の場合、変換が失敗し、sp がエラーで停止することです。int_date > 19500101最初のチェックが最初に評価され、false の場合は 2 番目の条件がスキップされると思いました。

このようにうまくいかないようです...または?これを行う他の方法はありますか?

ありがとう!

4

2 に答える 2

1

句は条件ではないため、クエリは構文的に正しくmonth(CONVERT....ありません。

あなたが特定の数と比較したいと仮定しましょう。あなたが望むものを表現する可能な方法は次のようになります

SELECT *
FROM   myTable
WHERE  case 
       when int_date > 19500101 
         then -1 
         else month(CONVERT(smalldatetime, ... int_date))
       end = @YourMonth

条件ではなく「月」の評価を「保護」します。

于 2013-04-14T09:08:52.007 に答える
-1

クエリを 2 つに分割してみてください。コンセプトは次のとおりです。

SELECT *
FROM (
    SELECT *
    FROM myTable
    WHERE int_date > 19500101
) t
WHERE month(CONVERT(smalldatetime, ... t.int_date))
于 2013-04-14T09:02:09.937 に答える