Replace three inverters with one

Operation CREATE TABLE:

CREATE TABLE `Tovar` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `idPreparat` MEDIUMINT(6) UNSIGNED NULL DEFAULT NULL,
    `drugApt` VARCHAR(250) NULL DEFAULT NULL,
    `countryApt` VARCHAR(250) NULL DEFAULT NULL,
    `manfApt` VARCHAR(250) NULL DEFAULT NULL,
    `md5` BINARY(16) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `ix_prep` (`idPreparat`),
    INDEX `ix_md5` (`md5`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

inquiry:

 SELECT id,
    IF(COUNT(Tovar.id)=1,Tovar.drugApt,'') AS `drugApt`,
    IF(COUNT(Tovar.id)=1,Tovar.countryApt,'') AS `countryApt`,
    IF(COUNT(Tovar.id)=1,Tovar.manfApt,'') AS `manfApt`
    FROM Tovar
    WHERE Tovar.md5=0x00000000000000000000000000000000
    GROUP BY Tovar.idPreparat

How to replace three IFs with one IF (COUNT (Tovar.id) = 1,)? add my idea:

    CASE COUNT(Tovar.id)>1
WHEN true THEN CONCAT_WS(@drugApt:='Tovar.drugApt',@countryApt='Tovar.countryApt',@manfApt='Tovar.manfApt') 
WHEN false THEN CONCAT_WS(@drugApt:='',@countryApt='',@manfApt='')
END
+4
source share
1 answer

If I understand your request correctly, a subquery can help achieve the desired results:

SELECT  tmp.id,
        COALESCE(t.drugApt, '') as drugApt,
        COALESCE(t.countryApt, '') as countryApt,
        COALESCE(t.manfApt, '') as manfApt
FROM    (
            SELECT      id,
                        IF(COUNT(id)=1, 1, 0) as cond
                FROM    Tovar
                WHERE   md5 = 0x00000000000000000000000000000000
              GROUP BY  idPreparat
        ) tmp
LEFT JOIN   Tovar t
    ON  t.id = tmp.id
    AND tmp.cond = 1

Does it help?

0
source

Source: https://habr.com/ru/post/1628443/


All Articles