Ik ben weer eens tegen een bug, of op z'n minst raar gedrag in mysql opgelopen.
Ik heb een veld met alleen getallen waarbij ik bij de output (wat mysql uitpoept) 1 op wil tellen en een voorloop 0 wil toevoegen als het getal minder dan 4 cijfers bevat.
dit met een taal als php oplossen is geen optie, het moet binnen mysql gebeuren
Dus
123 => 0124
1234 => 1235
het optellen gaat goed (het veld is van het type MEDIUMINT), maar de voorloop nul gaat fout. MySQL kent niet iets van sprintf() voor zover ik weet, dus heb het geprobeerd met LPAD.
Die functie weigert het alleen om met integers aan de slag te gaan. Ik krijg daardoor steevast 0000 terug. En mijn pogingen de integer naar een string te converteren mislukken ook. Alle functies die een string horen terug te geven bieden geen uitkomst. Heb bijvoorbeeld geprobeerd met CONCAT() niets er aan te plakken, 2x REVERSE(), etc.; het biedt allemaal geen oplossing.
De enige oplossing die ik zie is met een IF of CASE aan de slag te gaan en te kijken hoeveel getallen ik heb (met LENGT()) en aan de hand daarvan 0en er voor te zetten, maar dat vind ik niet zo'n elegante oplossing eigenlijk.
Kan iemand misschien iets beters verzinnen? Het liefst een middel om het als string aan LPAD te geven
Waarom ik het overigens een bug noem is dat er in de manual idd staat dat LPAD een string als argument neemt, maar andere functies die dat ook hebben staan lijken er geen moeite mee te hebben als je een integer geeft. Voorts: functies die (volgens de manual) beweren een string terug te geven zouden voor LPAD een oplossing moeten bieden, maar doen dat niet. (voor de zekerheid een getal tussen singel-quotes aan LPAD gegeven en dat lukte idd wel).
Oh, en nog even wat code om te laten zien wat ik gedaan heb:
Ik heb een veld met alleen getallen waarbij ik bij de output (wat mysql uitpoept) 1 op wil tellen en een voorloop 0 wil toevoegen als het getal minder dan 4 cijfers bevat.
dit met een taal als php oplossen is geen optie, het moet binnen mysql gebeuren
Dus
123 => 0124
1234 => 1235
het optellen gaat goed (het veld is van het type MEDIUMINT), maar de voorloop nul gaat fout. MySQL kent niet iets van sprintf() voor zover ik weet, dus heb het geprobeerd met LPAD.
Die functie weigert het alleen om met integers aan de slag te gaan. Ik krijg daardoor steevast 0000 terug. En mijn pogingen de integer naar een string te converteren mislukken ook. Alle functies die een string horen terug te geven bieden geen uitkomst. Heb bijvoorbeeld geprobeerd met CONCAT() niets er aan te plakken, 2x REVERSE(), etc.; het biedt allemaal geen oplossing.
De enige oplossing die ik zie is met een IF of CASE aan de slag te gaan en te kijken hoeveel getallen ik heb (met LENGT()) en aan de hand daarvan 0en er voor te zetten, maar dat vind ik niet zo'n elegante oplossing eigenlijk.
Kan iemand misschien iets beters verzinnen? Het liefst een middel om het als string aan LPAD te geven
Waarom ik het overigens een bug noem is dat er in de manual idd staat dat LPAD een string als argument neemt, maar andere functies die dat ook hebben staan lijken er geen moeite mee te hebben als je een integer geeft. Voorts: functies die (volgens de manual) beweren een string terug te geven zouden voor LPAD een oplossing moeten bieden, maar doen dat niet. (voor de zekerheid een getal tussen singel-quotes aan LPAD gegeven en dat lukte idd wel).
Oh, en nog even wat code om te laten zien wat ik gedaan heb:
code:
1
2
3
4
| SELECT LPAD('123', 4, 0); /* 0123 */
SELECT LPAD(('123'+1), 4, 0); /* 0000 */
SELECT LPAD((123+1), 4, 0); /* 0000 */
SELECT LPAD(CONCAT((123+1),''), 4, 0); /* 0000 */ |