Search
Write a publication
Pull to refresh

Case trick; «empty set» handling

Reading time1 min
Views682
Небольшой хак, позволяющий обработать «Empty set» в старых версиях MySQL (4+), в которых нет функций.


При написании небольшого запроса, я застопорился на следующей проблеме: в базе небыло запрашиваемой информации. Выглядело это примерно так:

set @var = (
    select
        case
            when
                t1.field is not null
            then
                t1.field
            else
                1
        end as field_name
    from
        table1 t1
        join table2 t2 on t1.tid = t2.id
    where
         t1.field2 = '_UNEXISTING_IN_DB_VALUE_'
    order by t1.tid desc
    limit 1
);


В этом блоке case как я только не пробовал получить единичку: функции, математические, логические опрерации, но ничегоне помогало: в ответ, при тестировании, было лишь «Empty set (0.06 sec)».

Я уж было решил оставить написаный практически сразу «костыль» в виде:

set @var2 = (select if(@var is null,1,@var));


Найти решение мне помог мой старый приятель, который посоветовал следующий подход: использовать номера столбцов, вместо их имён, а так же испоользовать обычный count. В результате, правильный запрос выглядит так:

set @var = (
    select
        case
            when
                count(1) > 0
            then
                t1.field
            else
                1
        end as field_name
    from
        table1 t1
        join table2 t2 on t1.tid = t2.id
    where
        t1.field2 = '_UNEXISTING_IN_DB_VALUE_'
    order by t1.tid desc
    limit 1
);


см. так же:
dev.mysql.com/doc/refman/4.1/en/all-subqueries.html
Tags:
Hubs:
Total votes 10: ↑6 and ↓4+2
Comments0

Articles