2012-03-13 3 views
0

NULL되지 않습니다 :쿼리 나 쿼리를 가지고

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 

이이 같은 결과를 생성 :

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

내가 거의 다입니다. 2147483647 (Mysql INT) 데이터 형식의 최대 값으로 사용했습니다, 내가 가진 유일한 문제는 하나가 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

정확하게 이해하면 0이 가장 작은 경우 t.deadlinesub.deadline의 0 값을 원하지 않습니다. 하지 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/ko/control-flow-functions.html # operator_case – Hotchips

+0

나는 느린 경우를 항상 생각했습니다. 그래서이 옵션을 건너 뛰었습니다. – 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