6

2つの別々の列を比較して、それらの間の最新の日付を考え出す必要があります。DATEDIFF(minute、date1、date2)を使用してそれらを比較していますが、一部のレコードでは、日付がNullであるため、nullの結果が返され、CASEが台無しになります。

これを回避する方法、またはどの日付がヌルであるかを事前に決定する方法はありますか?

(擬似コード)

UPDATE TABLE
SET NAME = p.name,
    NEW_DATE = CASE WHEN DATEDIFF(minute,d.date1,d.date2) <= 0 THEN d.date
                    ELSE d.date2
               END
FROM TABLE2 d
INNER JOIN TABLE3 p
  ON d.ACCTNUM = p.ACCTNUM
4

5 に答える 5

3

CASE に追加のロジックを追加するだけです。

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE 
                    WHEN d.date1 IS NULL THEN -- somewhat 
                    WHEN d.date2 IS NULL THEN -- somewhat 
                    WHEN DATEDIFF(minute,d.date1,d.date2) <= 0 THEN d.date 
                    ELSE d.date2 
               END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
  ON d.ACCTNUM = p.ACCTNUM 
于 2012-05-09T18:33:39.937 に答える
1

私は使用しますISNULL

UPDATE TABLE
SET NAME = p.name,
    NEW_DATE = CASE WHEN ISNULL(DATEDIFF(minute,d.date1,d.date2), 0) <= 0 THEN d.date
                    ELSE d.date2
               END
FROM TABLE2 d
INNER JOIN TABLE3 p
  ON d.ACCTNUM = p.ACCTNUM

または多分

ISNULL(DATEDIFF(minute,d.date1,d.date2), 1)

null 値を逆に処理したい場合。

于 2012-05-09T18:35:31.433 に答える
0

このように考えてみてください。Is Nullnull のチェックに使用できます。

UPDATE TABLE
SET NAME = p.name,
    NEW_DATE = CASE Case When date2 Is Null Then GetDate()
                    Case When date1 Is Null Then GetDate()
                    WHEN DATEDIFF(minute,d.date1,d.date2) <= 0 THEN d.date
                    ELSE d.date2
               END
FROM TABLE2 d
INNER JOIN TABLE3 p
  ON d.ACCTNUM = p.ACCTNUM

Microsoft の ISNULL() 関数は、NULL 値の処理方法を指定するために使用されます。

この場合、NULL 値をゼロにする必要があります。

以下では、"UnitsOnOrder" が NULL の場合、値が NULL の場合に ISNULL() がゼロを返すため、計算に悪影響を与えることはありません。

SQL Server / MS アクセス

SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products

SQL NULL 関数

于 2012-05-09T18:35:00.403 に答える
0

これにより、最小限の処理で必要なものが得られるはずです。

UPDATE TABLE
SET NAME = p.name,
    NEW_DATE = CASE WHEN COALESCE(date1, date2)>COALESCE(date2, date1) 
                    THEN COALESCE(date1, date2) 
                    ELSE COALESCE(date2, date1)
               END
FROM TABLE2 d
INNER JOIN TABLE3 p
  ON d.ACCTNUM = p.ACCTNUM
WHERE NOT (date1 is null and date2 is null);
于 2012-05-09T18:35:02.183 に答える