1

最近、値がnull. どうやら SQL では、何ともnull比較できませんnull

UPDATE company SET views = IF(views, views + 1, 1),
trendingViews = IF(viewed != '2012-05-21 00:00:00', 1, trendingViews + 1),
viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed)
WHERE id = '3024'

このクエリを変更して、提供された値を条件付きでチェックするにはどうすればよいnullですか?

4

6 に答える 6

4

または のいずれCoalesce(value1, ... valueN)かを使用isnull(value1, value2)して、NULL フィールドの代わりの非 NULL 値を定義します。

Coalesce引数のリストから最初の非 NULL 値を返します。Isnull最初の引数が null の場合、2 番目の引数の値を返します

于 2012-05-21T21:47:39.290 に答える
2

COALESCE を使用します。

UPDATE company 
SET views = COALESCE(views, 0) + 1,
    trendingViews = IF(viewed != '2012-05-21 00:00:00', 1, trendingViews + 1),
    viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed)
WHERE id = '3024'
于 2012-05-21T21:46:45.280 に答える
2

与えられた他の回答に加えて、NULL-safe 比較演算子も使用できます<=>

于 2012-05-21T21:53:19.473 に答える
1

null をチェックする適切な方法はMyField IS NULL. あなたが正しく述べているように、 と直接比較してnullもうまくいきません。

于 2012-05-21T21:46:09.307 に答える
1

a が null でない結果を除外する場合は、where 句でcolumn使用する必要があります。is not null

select ...
where ...
and column is not null
于 2012-05-21T21:46:19.603 に答える
1

警告: 私は mysql の人ではありませんが、TSQL の人です。最初に、条件付き更新ステートメントの 1 つの一般的なロジックに関するコメント: 特定の値について「表示済み」を最初にチェックし、「表示済み」がその値でない場合は、その値に設定すると、必要。

つまり、ID が 3024 のすべてのレコードの「閲覧済み」列のタイムスタンプを同じにしたい場合は、列に含まれる値を最初にチェックし、一致しないものだけを更新します。は不要であり、追加の作業も必要ありません。すべての「閲覧済み」(ID = '3024') を「2012-05-21 00:00:00」に設定する必要がある場合は、それらをその値に設定します。元の値が何であったかを考慮する必要はありません..気にしません。

したがって、代わりに:

viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed)

あなたはただ持っているでしょう:

viewed = '2012-05-21 00:00:00'

次に、if ステートメントで 'or' および/または 'coalesce' を使用して、null 値が無視されないようにすることができます。IS NULL で OR を使用したり、null 以外のデフォルト値と合体したりすることで、関係なく null 値を強制的に更新できます。(あなたの特定の例では、デフォルト値0でcoalesceを使用すると、「trendingViews」列の以前のnull値を1に設定する効果があります。これは、1ずつインクリメントしているため、デフォルト値として0を使用するためですnull インスタンスの場合)。

例:

trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 

更新ステートメントの最初の行...「ビュー」を設定する部分は、「ビュー」という名前の列/フィールドの存在を確認することが目的なのか、それともその「views」列の値がnullではないかどうかを確認してください。null でないかどうかを確認し、その場合は 1 ずつ増やし、null の場合は 1 に設定することを目的としている場合、これを行うことができます。

    views = IF(views IS NULL != 1, views + 1, 1),

したがって、これが私がテストするステートメント全体です(MYSQLで):

UPDATE company SET 
    views = IF(views IS NULL = 0, views + 1, 1),
    trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
    viewed = '2012-05-21 00:00:00'
WHERE id = '3024';

私はMYSQLを使用していないことを覚えておいてください....これらのMYSQLの変更をテストしていません。TSQL でこれを行っていた場合、次のステートメントが機能します。

    UPDATE company SET 
        [views] = (CASE WHEN [views] IS NOT NULL THEN [views] + 1 ELSE 1 END),
        trendingViews = CASE WHEN viewed IS NULL OR viewed != '2012-05-21 00:00:00' THEN 1 ELSE COALESCE(trendingViews, 0) + 1 END, 
        viewed = '2012-05-21 00:00:00'
    WHERE id = '3024';
    go
于 2012-05-21T23:06:10.297 に答える