Рубрика

MySQL

Всего: 54 записи

mysql select trim explode

Используются функции trim и substring_index. Пример — нужно получить id которые хранятся в формате '82','84','87':

SELECT * FROM `filters_vars` WHERE `shown`=1 AND `filter`=37 AND `id` IN (SELECT TRIM(BOTH "'" FROM (substring_index(`value`,",",1))) AS `values` FROM `filter_values` WHERE `value`!="" AND `filter`=37 AND `item` IN (SELECT `id` FROM `catalog` WHERE `shown`=1 AND (`parent`=76 OR `id` IN (SELECT `item` FROM `catalog_dub` WHERE `razdel`=76))) GROUP BY `values`) ORDER BY 'pos';
SELECT * FROM `filters_vars` WHERE
    `shown`=1 AND `filter`=37 AND `id` IN (
        SELECT TRIM(BOTH "'" FROM (SUBSTRING_INDEX(`value`,",",1))) AS `values` FROM `filter_values` WHERE
            `value`!="" AND `filter`=37 AND `item` IN (
                SELECT `id` FROM `catalog` WHERE `shown`=1 AND (`parent`=76 OR `id` IN (SELECT `item` FROM `catalog_dub` WHERE `razdel`=76))
            )
        GROUP BY `values`
    ) ORDER BY 'pos';

Firebird SELECT MAX CAST AS INT

Задача: нужно выбрать максимальное число из поля, формат которого текстовый.
При следующем запросе будет сделана выборка по алфавиту. т.е. будет выбрано, например, 999, когда присутствует значение 1000

SELECT MAX(HISTNUM) FROM CLIENTS

Обычно это решается так:

SELECT MAX(CAST(HISTNUM AS INT)) FROM CLIENTS

но в Firebird следующая ошибка:

conversion error from string ""
GDSCODE = 335544334
SQLCODE = -413

Решение: отсортировать вначале по длине строки, затем по алфавиту, выбрав одну строку. Варианты:

SELECT HISTNUM FROM CLIENTS ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC ROWS 1
SELECT HISTNUM FROM CLIENTS ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC ROWS 1 TO 1
SELECT FIRST 1 SKIP 0 HISTNUM FROM CLIENTS ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC

В конкретном случае нужно было еще сделать проверку на максимальную длину этого числа. Варианты:

SELECT HISTNUM FROM CLIENTS WHERE CHAR_LENGTH(HISTNUM)<7 ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC ROWS 1
SELECT FIRST 1 SKIP 0 HISTNUM FROM CLIENTS WHERE CHAR_LENGTH(HISTNUM)<7 ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC

convert all tables to innodb

Например, для всех таблиц MyISAM в БД:

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE = 'MyISAM';

затем с полученным списком:

ALTER TABLE `table_name` ENGINE=InnoDB;