2016-05-13 12 views
-1

Ist es möglich, die maximale Anzahl in einer Zeichenfolge wie dieser mit einer MySql-Abfrage zu erhalten?SQL-Abfrage Max. Zahlen in einer Zeichenfolge abrufen

"RANDOMTEXT $ £ 070.00/180.25"

in diesem Fall wäre es 80 sein ... Die Anzahl der Zahlen (sorry) in der String-Variable ist, auf einen Datensatz abhängig, die ich in einer anderen Tabelle haben . Die Anzahl maximal 999,99

Dank

+0

Es ist möglich, eine skalare Funktion zu erstellen, die dies tut. Muss es auch mit Dezimalzahlen umgehen können, oder sind es nur ganzzahlige Werte? – Sturgus

+0

Dezimalzahlen zu (xxx.xx) – user6331675

+0

Gibt es auch eine erwartete Obergrenze für die Anzahl? z.B. 999,999,999 – Sturgus

Antwort

1

Nein, es ist nicht.

Sie müssen den Text in Variablen analysieren, um sie in einen numerischen Datentyp umwandeln und dann den Vergleich durchführen. Wenn Sie eine solche Aufgabe in mehreren Zeilen ausführen möchten, ist die Aufgabe besser geeignet, in einer Funktion enthalten zu sein.

+0

und wahrscheinlich besser für eine Nicht-DB-Aufgabe geeignet. – Hogan

+0

Einverstanden. Wenn es @ user6331675 in SQL erfordert, ist dies jedoch möglich. Lösungen von Kopf bis Kopf wären langsam und würden am Set nicht gut funktionieren. – Sturgus

+0

Das Parsen selbst würde Kopfschmerzen bereiten, besonders wenn ich dort "zufälligen Text" sehe. < –

1

Das ist, was ich für SQL Server entwickelt habe. Sie können dieselbe Logik in MySQL verwenden, obwohl ich keine TRY_CAST-Funktion in MySQL kenne.

Vielleicht jemand, der MySQL-Syntax besser als ich kann das bearbeiten? Die folgende Abfrage gibt 999.00 zurück.

DECLARE @String Varchar(1000) = 'kdsfjalkjdf389kljsafd3.02laksjfd6098;lksadjf0394a;lkjdf3.45.2klasjdf4.68;laksjf296kljsdf999skldjf689.78' 
DECLARE @StringLen integer = LEN(@String) 
DECLARE @Parser integer = 0 
DECLARE @StringsTVP Table (
    Strings varchar(6) 
) 

WHILE @Parser < @StringLen - 1 
BEGIN 
    -- use max string length of 6, since the upper-limit is 999.99 
    INSERT INTO @StringsTVP (Strings) SELECT SUBSTRING(@String, @Parser, 1) 
    INSERT INTO @StringsTVP (Strings) SELECT SUBSTRING(@String, @Parser, 2) 
    INSERT INTO @StringsTVP (Strings) SELECT SUBSTRING(@String, @Parser, 3) 
    INSERT INTO @StringsTVP (Strings) SELECT SUBSTRING(@String, @Parser, 4) 
    INSERT INTO @StringsTVP (Strings) SELECT SUBSTRING(@String, @Parser, 5) 
    INSERT INTO @StringsTVP (Strings) SELECT SUBSTRING(@String, @Parser, 6) 
    SET @Parser = @Parser + 1 
END; 
SELECT MAX(TRY_CAST(Strings AS Decimal(5, 2))) AS MaxNumber 
FROM @StringsTVP 
+0

Für die Wiederverwendbarkeit würde ich empfehlen, dies in eine skalarwertige Funktion umzuwandeln, in der @String als Parameter eingespeist wird. Es würde 'RETURN SELECT MAX (TRY_CAST (Strings AS Dezimal (5, 2))) FROM @ StringsTVP' – Sturgus

+0

Ich habe auch festgestellt, dass MySQL Tabellenwerte nicht unterstützt? Daher sollte man es als "temporäre Tabelle" deklarieren, z. B. "CREATE TEMPORARY TABLE StringsTable (Strings varchar (6));' – Sturgus