Basi di dati – PostgreSQL pratico – Type Coercion

Type Coercion

PostgreSQL supporta tre convenzioni separate per la coercizione dei tipi (chiamata anche type casting, oxplicit type casting). Type coercion è un termine un po’ brutto che si riferisce ad un metodo PostgreSQL per cambiare un valore da un tipo di dati ad un altro. Nel mezzo di uno statement SQL, questo ha l’effetto di creare esplicitamente una costante di un tipo arbitrario.

Generalmente uno qualsiasi dei seguenti tre metodi può essere usato per lanciare il valore contenuto in una costante stringa verso un altro tipo:

  • tipo ‘valore’

  • ‘valore’::tipo

  • CAST (‘valore’ AS tipo )

Nel caso di costanti numeriche mantenute che si desidera lanciare in una stringa di caratteri, sarà necessario utilizzare una delle seguenti forme sintattiche:

  • value ::type

  • CAST (value AS type )

Il value in questa sintassi rappresenta la costante di cui volete modificare il tipo di dati, e il type rappresenta il tipo in cui volete forzare, o lanciare, il valore.

Nota: Ricordate che il tipo money è deprecato, e quindi non può essere facilmente castato.

Le costanti non sono gli unici valori di dati che possono essere forzati a tipi diversi. Le colonne di un insieme di dati restituiti da una query SQL possono essere forzate usando il loro identificatore in una delle seguenti forme sintattiche:

  • identificatore ::tipo

  • CAST (identificatore COME tipo)

Si tenga presente che non ogni tipo di dati può essere forzato in ogni altro tipo di dati. Per esempio, non c’è un modo significativo per convertire la stringa di caratteri abcd in un tipo di bit binario. Un casting non valido risulterà in un errore di PostgreSQL. I comuni casting validi sono da stringa di caratteri, tipo data/ora, o un tipo numerico a testo, o da stringhe di caratteri a valori numerici.

In aggiunta a queste convenzioni di casting, ci sono alcune funzioni che possono essere chiamate per ottenere essenzialmente lo stesso effetto di un cast esplicito di una qualsiasi delle forme precedentemente menzionate. Queste spesso portano il nome del tipo stesso (come la funzione text()), sebbene altre siano chiamate in modo più specifico (come bitfromint4()). L’esempio 3-30 mostra una funzione di questo tipo, che converte l’intero 1000 in una stringa di caratteri di typetext che rappresenta i caratteri 1000.

Esempio 3-30. Uso delle funzioni di conversione del tipo

booktown=# SELECT text(1000) booktown-# AS explicit_text; explicit_text--------------- 1000(1 row)

A causa di conflitti semantici riconosciuti dal parser di PostgreSQL, il formato di coercizione del tipo ‘value’ può essere usato solo per specificare il tipo di dati di un singolo valore (per esempio, una costante stringa legata da apici singoli). Al contrario, gli altri metodi di coercizione del tipo disponibili (‘value’::type,CAST(‘value’ AS type )e le funzioni di conversione del tipo, dove applicabili) possono essere usati per specificare il tipo di espressioni arbitrarie.

Questo è in parte perché il tentativo di seguire un tipo di dati con un’espressione raggruppata (ad es, tra parentesi) farà sì che PostgreSQL si aspetti una funzione con il nome del tipo di dati fornito (che spesso causerà un errore), mentre ciascuno degli altri metodi è sintatticamente valido su espressioni raggruppate.

booktown=# SELECT 1 + integer ('1' || '2') AS add_one_to_twelve;ERROR: Function 'integer(text)' does not exist Unable to identify a function that satisfies the given argument types You may need to add explicit typecastsbooktown=# SELECT 1 + ('1' || '2')::integer AS add_one_to_twelve; add_one_to_twelve------------------- 13(1 row)booktown=# SELECT 1 + CAST('1' || '2' AS integer) AS add_on_to_twelve; add_on_to_twelve------------------ 13(1 row)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.