Autor Zpráva
venca12
Profil
Ahoj, mám sloupec id typu int sloupec column, typu varchar a v něm uložená nějaká čísla, např.: 1, 10, 20, 35.

A potřebuji je seřadit jako čísla, ne jako řetězec. Což by nebyl problém. Mohl bych k tomu použít některý z následujících zápisů:
...ORDER BY CAST(column AS UNSIGNED) DESC;

...ORDER BY ABS(column) DESC;
...ORDER BY column+0 DESC;
Já ale potřebuji do klauzule ORDER vložit podmínku. Například takto:
...ORDER BY IF(1=1, column, id) DESC;
Problém však je v tom, když column a id nejsou stejného datového typu. Například column je varchar a id int, potom výraz nevrací požadovaný výsledek. Pokud napíšu toto:
...ORDER BY IF(1=1, ABS(column), id) DESC;
, tak vše funguje, tak jak má, protože column i id jsou celočíselného typu. To mi ale bohužel nevyhovuje.

Pokud máte někdo nějaký nápad co s tím, uvítám jakékoli smysluplné rady. Btw. provozuji to na jakési verzi 4.1.

Díky za rady.
tiso
Profil
Začni z opačného konca: o čo Ti vlastne ide?
venca12
Profil
Mno potřebuju řadit, podle jednoho sloupce ze dvou na základě vyhodnocení podmínky v klausuli ORDER BY, myslel jsem, že je to z předchozího postu zřejmé (druhá, třetí a čtvrtá věta).

Pořešil jsem to skriptováním v php. Problém je ale v tom, že prostě nefunguje ORDER BY, pokud je jeden výsledek podmínky rozdílného datového typu od druhého. Což mě překvapilo. Pokud jsou oba řetězec, nebo oba celočíselného typu tak to funguje.

Předpokládám, že to je způsobeno tím, že se snadno může stát, že na polovině řádků bude podmínka vyhodnocena jako true a na druhé, jako false. Tzn. první polovina řádků by se měla řadit jako řetězec a druhá, jako číslo, tak mysql jednoduše nějak ignoruje podmínku s různými datovými typy ve výsledku. Samozřejmě v mém případě k tomu nikdy nedoje a ani v ukázce, kterou jsem uvedl nahoře k tomu také nemůže dojít, protože podmínka 1=1 bude vždycky splněna. Klidně by to mohlo mysql umožnit a řvát až při vracení výsledků, hmm.

Btw. ahoj prudérní tiso
tiso
Profil
venca12
...ako povieš...
Toto téma je uzamčeno. Odpověď nelze zaslat.