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

SQL Server 2008-存在しない場合は、ELSEUPDATEを挿入します

    一見、あなたの最初の試みはかなり近いように見えます。 clockDateはDateTimeフィールドであると想定しているので、これを試してください:

    IF (NOT EXISTS(SELECT * FROM Clock WHERE cast(clockDate as date) = '08/10/2012') 
        AND userName = 'test') 
    BEGIN 
        INSERT INTO Clock(clockDate, userName, breakOut) 
        VALUES(GetDate(), 'test', GetDate()) 
    END 
    ELSE 
    BEGIN 
        UPDATE Clock 
        SET breakOut = GetDate()
        WHERE Cast(clockDate AS Date) = '08/10/2012' AND userName = 'test'
    END 
    

    getdateは現在の日付を提供することに注意してください。 (時刻なしの)日付と比較しようとしている場合は、キャストする必要があります。そうしないと、time要素によって比較が失敗します。

    clockDateが日時フィールドではない(日付のみ)場合は、SQLエンジンが自動的に行います。set/insertステートメントにキャストする必要はありません。

    IF (NOT EXISTS(SELECT * FROM Clock WHERE clockDate = '08/10/2012') 
        AND userName = 'test') 
    BEGIN 
        INSERT INTO Clock(clockDate, userName, breakOut) 
        VALUES(GetDate(), 'test', GetDate()) 
    END 
    ELSE 
    BEGIN 
        UPDATE Clock 
        SET breakOut = GetDate()
        WHERE clockDate = '08/10/2012' AND userName = 'test'
    END 
    

    他の人が指摘しているように、mergeステートメントはこれと同じロジックに取り組むもう1つの方法です。ただし、場合によっては、特に大規模なデータセットの場合、マージステートメントが非常に遅くなり、大量のトランザクションログアクティビティが発生する可能性があります。したがって、上記のように論理化する方法を知ることは、依然として有効な手法です。



    1. SQL:最初に見つかった行の結合を制限する方法は?

    2. MySQL/MariaDBでデータベースを削除する方法

    3. フラグ変数に基づいてrow_number()シーケンスを中断します

    4. mysqlでGROUPBYを使用するときに、MAX()である最長のテキストフィールドを選択するにはどうすればよいですか?