sql >> データベース >  >> RDS >> Mysql

正しいSQLのヘルプが必要

    ANDとORの間の優先順位を確認します。

    算術演算では、乗算は加算よりも優先されます。

    例:10 + 10 * 10 =110、ただし(10 + 10)* 10=200。

    ANDやORと似ています。 ANDはORよりも優先順位が高いため、これは括弧なしで行われます:

    WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1' 
      OR BookingInfo.ClinicID = '2'
    

    このように機能します:

    WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1') 
      OR BookingInfo.ClinicID = '2'
    

    ただし、次のように機能させる必要があります:

    WHERE BookingInfo.BookingDate = '05-18-2010' AND 
      (BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')
    

    したがって、括弧を入れて、優先順位が希望どおりに機能することを確認してください。

    また、MM-DD-YYYY形式の日付を使用していることに気付きました。これは、MySQLでは日付リテラルとして認識されません。 YYYY-MM-DD形式を使用する必要があります。それは別の問題を引き起こしている可能性があります。

    SELECT DATE('05-18-2010'); -- returns NULL
    SELECT DATE('2010-05-18'); -- returns 2010-05-18
    

    コメントを再確認してください:

    はい、確かにANDの方がORよりも優先されます。 1つには、MySQLのすべての演算子の優先順位の階層がここに文書化されています: http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html

    最初に述べた問題を使用して例を見てみましょう:

    BookingDate   ClinicID 
    2010-05-18    2
    2008-05-18    2
    
    WHERE BookingInfo.BookingDate = '2010-05-18' AND 
      BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'
    

    この式を使用すると、最初の行のみが一致する必要があります。しかし、2番目の行の日付が正しくない場合でも、両方の行が一致していることがわかりました。なんで?各比較をTRUEまたはFALSEに置き換えましょう:

    TRUE AND FALSE OR TRUE
    FALSE AND FALSE OR TRUE
    

    ORの優先順位が高い場合、次のように評価されます。

    TRUE AND (FALSE OR TRUE)
    FALSE AND (FALSE OR TRUE)
    

    OR TRUEと組み合わせた値はTRUEになるため、これらの括弧内の部分式は次のようになります。

    TRUE AND (TRUE)
    FALSE AND (TRUE)
    

    また、FALSE AND TRUEはFALSEになるため、2番目の行は一致しません。しかし、2行目が正しく一致していないことがわかったため、それはできません。

    実際、ANDはORよりも優先順位が高いため、AND部分式を括弧で囲んでいるかのように評価されます。

    (TRUE AND FALSE) OR TRUE
    (FALSE AND FALSE) OR TRUE
    

    これは次のようになります:

    (FALSE) OR TRUE
    (FALSE) OR TRUE
    

    どちらの場合も、FALSEまたはTRUEはTRUEになり、両方の行が一致します。

    したがって、括弧がない場合、デフォルトのセマンティクスでは、ANDがORよりも優先されます。かっこが必要です:

    WHERE BookingInfo.BookingDate = '2010-05-18' AND 
      (BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')
    


    1. ResultSet.getString(Date)はドライバーによって異なります

    2. パスワードなしでpsqlコマンドを使用してバッチファイルを実行する

    3. グループ化の最初と最後のタイムスタンプ間の別のフィールドの違いを取得します

    4. Postgresデータ型キャスト