2012-03-13 4 views
0

ではない私は、クエリを持っている:私はほとんどそこだクエリはNULL

taskDeadline | subtasksDeadline | Deadline 
1338501600 | 1333058400  | 1333058400 
1334268000 | NULL    | 1334268000 
NULL   | 1328050800  | 1328050800 
NULL   | NULL    | NULL 
1353798000 | 0    | 0 
0   | 1353798000  | 0 

SELECT 
    taskDeadline, 
    subtasksDeadline, 
    REPLACE(
     LEAST(
      COALESCE(t.deadline, 2147483647), 
      COALESCE(sub.deadline, 2147483647) 
     ), 2147483647, NULL 
    ) AS Deadline 
FROM 
    tasks t 
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id 

これは、このような結果を生成します。私は2147483647(Mysql INT)のデータ型の最大値として使用していますが、まだ唯一の問題は、2つの値のうち1つが0の場合、他の値を取得したいということです。私は時間を費やしましたが、そこには行けません。誰かがこれに光を当てることができますか?

答えて

2

それとも既存のCOALESCEにNULLIFを追加 - 詳細情報については

SELECT 
    taskDeadline, 
    subtasksDeadline, 
    NULLIF(
     LEAST(
      COALESCE(NULLIF(t.deadline, 0), 2147483647), 
      COALESCE(NULLIF(sub.deadline, 0), 2147483647) 
     ), 2147483647 
    ) AS Deadline 
FROM 
    tasks t 
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id 
+0

すばやく簡単です。私はこの解決策を好む。 NULLIFについて知りませんでした、ありがとう! – Leonard

0

私が正しく理解していれば、ゼロが最も小さい場合、t.deadlinesub.deadlineのゼロ値は望ましくありません。だから、case文を使用しないのはなぜCOALESCE

SELECT 
    taskDeadline, 
    subtasksDeadline, 
    REPLACE(
     LEAST(
      COALESCE(IF(t.deadline = 0, NULL, t.deadline), 2147483647), 
      COALESCE(IF(sub.deadline = 0, NULL, sub.deadline), 2147483647) 
     ), 2147483647, NULL 
    ) AS Deadline 
FROM 
    tasks t 
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id 
1

から絞り出さされる、NULLに0を変換することができますか?

SELECT 
    taskDeadline, 
    subtasksDeadline, 
    CASE 
     WHEN t.deadline IS NULL AND sub.deadline IS NULL THEN NULL 
     WHEN t.deadline IS NULL THEN sub.deadline 
     WHEN sub.deadline IS NULL THEN t.deadline 
     WHEN t.deadline > sub.deadline THEN sub.deadline 
     WHEN sub.deadline > t.deadline THEN t.deadline 
     WHEN sub.deadline = t.deadline THEN sub.deadline -- or this could be t.deadline 
    END AS Deadline 
FROM 
    tasks t 
    LEFT OUTER JOIN subtasks sub 
     ON sub.task_id = t.id 
+1

: http://dev.mysql.com/ doc/refman/5.0/ja/control-flow-functions.html#operator_case – Hotchips

+0

私はいつもCASE WHENが遅いと思っていました。だから私はこのオプションをスキップしました。 – Leonard

+0

データセットのサイズによって異なります。この特定の問題に必要なものを正確に行い、さらに読みやすくしています。 – afuzzyllama

0

このクエリを使用してみてください -

SELECT 
    taskDeadline, 
    subtasksDeadline, 
    LEAST(
     IF(t.deadline = 0 OR t.deadline IS NULL, sub.deadline, t.deadline), 
     IF(sub.deadline = 0 OR sub.deadline IS NULL, t.deadline, sub.deadline) 
    ) AS Deadline 
FROM 
    tasks t 
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id 
関連する問題