Tekst omzetten in getal in MySQL-query

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%

Je kunt SUBSTRINGen CONVERT:

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);

Waarbij name_columnde kolom is met de “name-” waarden. De SUBSTRINGverwijdert alles vóór het zesde teken (d.w.z. het voorvoegsel “naam-“) en vervolgens converteert de CONVERTde 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 LOCATEin 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:

namekan 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

Other episodes