2017-03-09 4 views
6

Ich benutze MySQL 5.5.37. Ich möchte die Warnungen von meinem Update-Anweisung zu beseitigen, die unter ...Wie überschreibe ich meine MySQL Update-Anweisung, um die Warnungen "Abgeschnittene falsche INTEGER-Werte" zu beseitigen?

update resource r 
    set grade_id = convert(substring_index(substring_index(
        r.description, 'Grade ', -1), ' ', 1), unsigned integer) 
    where r.description like '% Grade%' 
     and CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
        r.description, 'Grade ', -1), ' ' ,1),UNSIGNED) > 0; 

Query OK, 0 rows affected, 7 warnings (0.02 sec) 
Rows matched: 1333 Changed: 0 Warnings: 7 

mysql> show warnings; 
+---------+------+--------------------------------------------------+ 
| Level | Code | Message           | 
+---------+------+--------------------------------------------------+ 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
+---------+------+--------------------------------------------------+ 

gezeigt Was ich nicht verstehe, ist, wie ich meine Frage anders angegeben umschreiben kann, dass keiner der Werte übereinstimmen aktualisiert werden, was die Warnungen beschweren sich darüber. Im Folgenden finden Sie meine Frage, wo ich die unterschiedlichen Werte aufgelistet, die aktualisiert werden ...

mysql> select distinct substring_index(substring_index(
       r.description, 'Grade ', -1), ' ', 1) 
      from resource r 
      where r.description like '% Grade%' 
      and CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
       r.description, 'Grade ',-1),' ',1),UNSIGNED) > 0; 
+-----------------------------------------------------------------------+ 
| substring_index(substring_index(r.description, 'Grade ', -1), ' ', 1) | 
+-----------------------------------------------------------------------+ 
| 7                  | 
| 8                  | 
| 11                 | 
| 9                  | 
| 12                 | 
| 10                 | 
| 6                  | 
+-----------------------------------------------------------------------+ 

Wie kann ich eine Update-Anweisung neu zu schreiben, so dass es die gleichen Werte aktualisiert, ohne tryihng falsche Zahlen zu kürzen?

+0

Zeigen Sie Ihre Daten. – olegsv

+0

habe ich schon getan. In der letzten Abfrage "wähle distinct substring_index (substring_index (r.description, 'Grade', -1), '", 1) aus der Ressource r, wo r.description wie'% Grade% 'und CONVERT (SUBSTRING_INDEX (SUBSTRING_INDEX (r .description, 'Note', -1), '', 1), UNSIGNED)> 0; ". Wenn Sie möchten, dass ich eine weitere Abfrage durchführe, sagen Sie mir, was ich ausführen soll. – Dave

+0

Könnten Sie möglicherweise zeigen, was die Daten _raw_ sind und wie das Ergebnis _final_ in der Tabelle (nach dem Update) aussehen soll? –

Antwort

3

Soweit meines Wissens Sorge erhalten Sie die Warnung wegen WHERE Klausel Zustand

CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(r.description, 'Grade ',-1),' ',1),UNSIGNED) > 0 

Wie deutlich in Warnhinweis erwähnen.

| Level | Code | Message           | 
+---------+------+--------------------------------------------------+ 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo' 

die darauf hindeuten, dass Sie keine spezifischen Muster für Wert in description Spalte der Tabelle resource hatte.

Wie unten

description 
Foo Grade 100 Bar 
Foo Grade 99 Grade 
Foo Grade 98 Grade MyCO 

Wie in der zweiten & dritten Reihe in obigen Code angezeigt werden, haben Sie mehrere Grade Zeichenfolge in Datensatz. Welche indirekt beeinflussen SUBSTRING_INDEX(SUBSTRING_INDEX(r.description, 'Grade ',-1),' ',1), Linie. Also, was mein Vorschlag ist, bitte stellen Sie sicher, dass alle Datensätze ordnungsgemäß eingefügt. Wenn alle Datensätze ordnungsgemäß eingefügt werden und prüfen, ob sie mehrere Mustertypen für die descripton-Spalte enthalten. Wenn mehrere Muster enthalten sind, müssen Sie diese Abfrage mit UNION neu schreiben. Einzelabfrage für ein Muster und eine weitere Abfrage für ein anderes Muster.

Und versuchen Sie einfach unten aktualisierte Abfrage.

update resource r 
    set grade_id = convert(substring_index(substring_index(
        r.description, 'Grade ', -1), ' ', 1), unsigned integer) 
    where r.description like '% Grade%' 
    and substring_index(substring_index(r.description, 'Grade ', -1), ' ', 1) REGEXP '[0-9]+'; 

Ich hoffe, diese Erklärung hilft Ihnen.

+0

Hmm .. Ihr Beispiel sieht dieser [rexester demo] sehr ähnlich (http://rextester.com/TVHN10678). War das nur ein Zufall? –

+0

Muss "verankert" werden: 'REGEXP '^ [0-9] + $'' –

1

Irgendwo in Ihrer resource.description Spalte haben Sie entweder '' oder MyCo gemäß Ihrer Warnungen ausgegeben. Es gibt nicht numerische Daten, die an die convert-Funktion übergeben werden, von wo die Warnungen kommen.

Ich weiß nicht, wie Ihre Rohdaten aussehen, aber wenn Sie die folgende Abfrage ausführen, sollte es alle Zeilen identifizieren, in denen resource.description nicht im richtigen Format ist.

select distinct substring_index(substring_index(r.description, 'Grade ', -1), ' ', 1) 
from resource r 
order by r.description 

Sie können versuchen, eine EXPLAIN auf Ihre Abfrage auch auszuführen. Dies kann Ihnen mehr Einblick geben. Ich kenne die Interna von MySQL nicht, aber vielleicht sieht die Konvertierungsfunktion irgendwie alle Zeilen aus, obwohl sie eine Klausel where hat.

2

Sie erhalten die Warnungen wegen der WHERE-Klausel, nicht der SELECT-Klausel. Da ungültig (nicht numerisch) Werte werden

zu 0 der Bedingung umgewandelt
CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
      r.description, 'Grade ',-1),' ',1),UNSIGNED) > 0 

Retuns false. Daher erscheinen diese Zeilen nicht im Ergebnis. Entfernen Sie diese Bedingung in Sie Anweisung auswählen, um zu sehen, welche Zeilen die Warnungen verursachen:

select distinct 
    substring_index(substring_index(
     r.description, 'Grade ', -1), ' ', 1), 
    CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
     r.description, 'Grade ',-1),' ',1),UNSIGNED), 
     r.description 
from resource r 
where r.description like '% Grade%'; 

Beispiel: http://rextester.com/TVHN10678

Da ich Ihre Daten nicht wissen, ich kann nicht helfen, es zu beheben. Verkürzte aufgrund falscher Integer-Wert für '' und MyCo Wert

2

Können Sie trim() vor dem Konvertieren verwenden, um irgendwelche Leerzeichen zu entfernen, die sich eingeschlichen haben könnten? das ist auch der Grund für diese Warnung

2

Sie können versuchen, reguläre Ausdrücke zu verwenden, so etwas wie:

wo r.description like '% Grade%' und SUBSTRING_INDEX (SUBSTRING_INDEX ( r.description, 'Note', -1), '', 1) REGEXP '^ [0-9] + $';

Alternativ, wenn Sie von Schritt in Grauzone keine Angst haben: Sie auch die gleiche Abfrage ohne CONVERT überhaupt versuchen kann - überraschend kann es einfach funktionieren:

wo r.description like ‚% Grade % ' und SUBSTRING_INDEX (SUBSTRING_INDEX ( r.description,' Note ', -1),' ', 1)> 0;

(wieder bin ich mir nicht sicher, ob dies dokumentiert ist, also - 'graue Fläche').

Verwandte Themen