Is het mogelijk om tekst om te zetten in een getal binnen een MySQL-query? Ik heb een kolom met een identifier die bestaat uit een naam en een nummer in de notatie “naam-nummer”. De kolom heeft het type VARCHAR. Ik wil de rijen sorteren op nummer (rijen met dezelfde naam) maar de kolom is gesorteerd op tekenvolgorde, d.w.z.
name-1
name-11
name-12
name-2
Als ik het nummer afsnijd, kan ik dan het ‘varchar’-nummer omzetten in het ‘echte’ nummer en het gebruiken om de rijen te sorteren? Ik wil graag de volgende bestelling ontvangen.
name-1
name-2
name-11
name-12
Ik kan het nummer niet als een aparte kolom weergeven.
bewerkt 11-05-11 9:32
Ik heb de volgende oplossing gevonden ... ORDER BY column * 1
. Als de naam geen cijfers bevat, is het dan veilig om die oplossing te gebruiken?
Antwoord 1, autoriteit 100%
Dit zou moeten werken:
SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
Antwoord 2, autoriteit 13%
SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);
Waarbij name_column
de kolom is met de “name-” waarden. De SUBSTRING
verwijdert alles vóór het zesde teken (d.w.z. het voorvoegsel “naam-“) en vervolgens converteert de CONVERT
de overgebleven waarde naar een echt geheel getal.
UPDATE: Gezien de veranderende omstandigheden in de opmerkingen (dwz het voorvoegsel kan van alles zijn), moet je een LOCATE
in de mix:
ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);
Dit veronderstelt natuurlijk dat het niet-numerieke voorvoegsel geen koppeltekens bevat, maar de relevante opmerking zegt dat:
name
kan elke reeks letters zijn
dus dat zou een veilige aanname moeten zijn.
Antwoord 3, autoriteit 10%
Gewoon CAST gebruiken,
CAST(column_name AS UNSIGNED)
Het type voor het cast-resultaat kan een van de volgende waarden zijn:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
Antwoord 4, autoriteit 5%
U kunt CAST()gebruiken om van string naar int. bijv. SELECT CAST('123' AS INTEGER);
Antwoord 5, autoriteit 4%
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
Antwoord 6, autoriteit 3%
Een eenvoudige manier Selecteer ‘123’ + 0
Antwoord 7
Om nummer te krijgen, probeer dan met SUBSTRING_INDEX(field, '-', 1)
Converteer vervolgens.
Antwoord 8
Als uw primaire sleutel een tekenreeks in een formaat is zoals
ABC / EFG / EE / 13/123 (volgnummer)
Dit soort string kan eenvoudig worden gebruikt voor het sorteren met de scheidingsteken (“/”)
We kunnen de volgende zoekopdracht gebruiken om een tabel te bestellen met dit type sleutel
SELECT * FROM `TABLE_NAME` ORDER BY
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC
Antwoord 9
cast(REGEXP_REPLACE(NameNumber, '[^0-9]', '') as UNSIGNED)
Antwoord 10
Ik vond het gemakkelijker om Regex_Replace-functie te gebruiken om alle niet-numerieke waarden uit het veld te verwijderen en vervolgens sorteren.
SELECT field , CONVERT(REGEXP_REPLACE(field,'[^0-9]',''),UNSIGNED) AS num FROM your_table ORDER BY num;
Antwoord 11
select
`a`.uuid,
concat('1',REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(`a`.uuid,'-',''),'b','11'),'c','12'),'d','13'),'e','14'),'f','15'),'a','10')),
Antwoord 12
een generieke manier om te doen:
SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC