sql >> Database >  >> RDS >> PostgreSQL

Fout ongeldige invoersyntaxis voor geheel getal voor een niet-geheel getal?

Uw invoer mislukt met een syntaxisfout in de ARRAY-constructor voordat je zelfs maar bij resolutie functietype komt - waar u meer foutmeldingen krijgt vanwege andere typen die niet overeenkomen als u de ARRAY-constructor verwijdert die helemaal niet in de aanroep zou moeten staan.

Uw oplossing is om afzonderlijke parameters van overeenkomend type door te geven , niet een array. De rest is slechts een uitleg van wat we zagen.

Wat is er echt gebeurd

Een array kan alleen waarden van hetzelfde type bevatten, maar uw invoer combineert numerieke constanten met een niet-numerieke tekenreeks letterlijk , die niet kan worden opgelost.

Als je wilt dat het wordt opgelost in text[] (array van text ), moet u letterlijke tekenreeksen opgeven, zoals:

SELECT ARRAY['1004', '2', '1079412', 'WwLEA6XZ0'];

Of direct een letterlijke array, zoals:

SELECT '{1004, 2, 1079412, WwLEA6XZ0}'::text[];

Maar zodra u een ARRAY-constructor met numerieke constanten start, mogen alleen numerieke typen worden toegevoegd. Of op zijn minst tekenreeksen met inhoud die tot hetzelfde type kan worden gedwongen. Je zou :

SELECT ARRAY[1004, 2, 1079412, '1'];

... resulterend in int[] . Of:

SELECT ARRAY[1004, 2, 1079412, 1.0];

Of zelfs:

SELECT ARRAY[1004, 2, 1079412.0, '1.0'];

... beide resulterend in numeric[] .

Maar ARRAY[1004, 2, 1079412, 'WwLEA6XZ0V'] is illegaal en terecht.

De exacte regels voor typeresolutie voor arrayconstructors zijn te vinden in dit hoofdstuk van de handleiding:"Typeconversie" - "UNION, CASE en gerelateerde constructies" . Je reis eindigt om:

Sinds de letterlijke tekenreeks 'WwLEA6XZ0V' kan niet worden geconverteerd naar integer .




  1. SQL-injectie die mysql_real_escape_string() omzeilt

  2. Hoe SQL Server op SUSE 12 te installeren

  3. Oracle DBMS - Lees een tabel voor verwerking Updaten in een AFTER-trigger - tabel muteren

  4. DATE opzoektabel (1990/01/01:2041/12/31)