sql >> Database >  >> RDS >> Mysql

haal getallen uit een *varchar*-cel en bereken ze in pure mysql

Het kan zeker worden gedaan, maar SQL is ontworpen rond het axioma van atomaire waarden (d.w.z. eerste normaalvorm ). Het splitsen van een veld is bijna nooit nodig. Ongeveer de enige keer dat u het in een goed ontworpen database hoeft te gebruiken, is met datums waar u misschien alleen met de maand of het jaar van een datumveld wilt werken. Hoewel je zeker databases zult vinden die door een of andere idioot zijn ontworpen en waarmee je moet werken die dit kernconcept schenden, is het een slecht idee om te beginnen met proberen uit te zoeken hoe je met deze ontwerpen kunt werken.

Bovendien doet je laatste stap van "opslaan in die cel 239" me denken dat je nog steeds naar databases kijkt alsof het spreadsheets zijn. Zij zijn niet. Een ander kernonderdeel van een database is dat de volgorde van rijen niet belangrijk is. Velden daarentegen zijn altijd gerelateerd aan andere velden in dezelfde rij. U kunt de waarde van een van de velden instellen op iets waarbij het ID-veld van dat record 239 is, maar u zult zich er in het algemeen nooit druk om maken dat een record de 239e is.

Dat gezegd hebbende, hier is een vraag die zal doen wat je wilt:

Aanname:het formaat van het veld is "11a22 b". Dat wil zeggen, een tweecijferig nummer, gevolgd door een letter, gevolgd door nog een tweecijferig nummer, mogelijk gevolgd door een spatie en de letter 'b'.

SELECT CAST(SUBSTRING(Value,1,2) AS INT) 
    * CAST(SUBSTRING(Value,3,2) AS INT) 
    + CASE RIGHT(Value,1) WHEN 'b' THEN -1 ELSE 0 END
FROM MyTable


  1. ActiveAndroid Pre-tabel vullen met schemamigratie

  2. MySQL:tel records van de ene tabel en werk vervolgens een andere bij

  3. Incrementele statistieken voor SQL Server 2014

  4. Oracle invoegen van select in tabel met meer kolommen