2015-05-26 3 views
0

это сводит меня с ума!Coalesce потянув ноль как значение

У меня есть три стола. Первая таблица содержит список всех записей вместе с другими данными (регион, даты и т. Д.). Вторая и третья таблицы содержат все данные о часах/затратах, но вторая таблица содержит только исторические записи, а третья таблица содержит более новые записи. Я хочу, чтобы мой coalece попытался сначала найти значение в новых записях, но если запись не найдена, посмотрите в историческую таблицу. По какой-то причине, даже если я знаю, что это значение в исторической таблице, результат моего COALESCE приходит как 0.

Table1 

ID  Region 
1  US 
2  US 
3  Europe 
4  US 
5  Europe 
6  US 

Table2 

ID  Hours 
1  10 
2  15 
3  20 


Table3 

ID  Hours 
4  3 
5  7 
6  4 

Итак, мое заявление написано, как это:

SELECT t1.ID, COALESCE(t3.hours, t2.hours) AS HOURS FROM table1 t1 LEFT JOIN table2 t2 ON t1.ID=t2.ID LEFT JOIN table3 t3 ON t1.ID=t3.ID

Теперь, по какой-либо причине, если значение найдено в t3 (более новые записи), оно вытягивает правильное значение, но если оно не находит значения и должно вытягивать значение из t2, оно вытягивается вместо 0 вместо фактического значения. Результат выглядит следующим образом:

ID  HOURS 
1  0 
2  0 
3  0 
4  3 
5  7 
6  4 

Я думаю, что это что-то делать с типом столбца в таблице 2 (у меня есть все настройки столбцов как VARCHAR (55), но я не могу найти какие-либо правила вокруг данных . типы в функции Coalesce о необходимости использовать только определенный тип столбца с COALESCE

Цените никаких указаний

отредактирован, чтобы добавить результаты для запроса Спенсера:

ID  t2.hours + 0 t2.hours hex(t2.hours) length(t2.hours) 
413190 240   240   F0     3 
+1

не должен 'on' для последнего соединения таблицы быть' t1.id = t3.id'? или это просто опечатка? – xQbert

+0

Ваш запрос выглядит хорошо. Вот [скрипт SQL] (http://sqlfiddle.com/#!3/e3f43/5/0), показывающий, что он работает. Я думаю, что у вас есть проблема с данными где-то, что обфускается вашим вопросом. – xQbert

+0

Вы говорите, что столбец 'hours' в' t2' - VARCHAR (55). Значения выражений выглядят правильно, '240 'в качестве символьной строки, имеет длину 3 байта и вычисляет числовое значение' 240'. Выход из HEX странный. Если этот столбец является символом latin1, обязательно ожидайте возвращения '323430'. Возврат 'F0' очень странный. Интерпретируется как целое значение (TINYINT), которое равно десятичной (15 * 16) + (0 * 1) = '240'. Очень странно. Что такое символ столбца 'hours'? Какая версия MySQL?(выводятся из 'SHOW CREATE TABLE table2' и выводятся из' SHOW VARIABLES LIKE 'version%' ' – spencer7593

ответ

2

Некорректное присоединяется:

FROM table1 t1 
LEFT JOIN table2 t2 ON t1.ID=t2.ID 
          ^
LEFT JOIN table3 t3 ON t1.ID=t2.ID 
          ^

вы присоединяетесь таблицу 3, используя значения из таблицы 2

+0

Marc B - вы правы, что мое заявление о соединении было неправильным в моем примере, но, к сожалению, это было просто утомление, когда я настраивал все, чтобы задать вопрос (я его отредактировал). В моем фактическом запросе SQL все соединения идеальны. – sqlnewb

0

Похоже оценки t2.hours в функции COALESCE это делается в цифровой контексте, а значения сохраняются в столбце hours оценивают числовое значение 0.

Один быстрый способ проверить, что числовая, что имеет значение, чтобы добавить ноль, как и в первом выражении в этом запросе:

SELECT t2.hours + 0 
     , t2.hours 
     , HEX(t2.hours) 
     , LENGTH(t2.hours) 
    FROM table2 t2 

Мне любопытно, что этот запрос показывает на один из рядов, это возвращая 0 из выражения COALESCE, возвращает ли числовая оценка 0, и есть ли какие-либо ведущие символы в символе в значении столбца.

+0

Hi Spencer7593, делая вышеуказанные на реальных страницах в моей реальной базе данных, я получил следующий результат на одной из записей, которые демонстрируют поведение, о котором идет речь. Некоторые из строк имеют шестнадцатеричные значения, которые являются всеми числами, а некоторые имеют буквенно-цифровые значения (как это делает идентификатор): ID t2.hours + 0 t2.hours hex (t2.hours) длина (t2.hours) 413190 240 240 F0 3 Не знаете, что указывает F0. – sqlnewb

+0

Я отредактировал мой вопрос, чтобы показать, какие результаты я получил от вашего чека. Это не позволило мне добавить комментарии без глупого форматирования :) – sqlnewb

Смежные вопросы