PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment fonctionne pg_typeof() dans PostgreSQL

Dans PostgreSQL, le pg_typeof() La fonction vous permet d'obtenir le type de données de n'importe quelle valeur.

Plus précisément, il renvoie l'OID du type de données de la valeur qui lui est transmise. Il renvoie un regtype , qui est un type d'alias OID. Par conséquent, il s'agit de la même chose qu'un OID à des fins de comparaison, mais il s'affiche sous la forme d'un nom de type.

Syntaxe

La fonction a la syntaxe suivante :

pg_typeof(any)

any est n'importe quelle valeur.

Exemple

Voici un exemple de base pour illustrer.

SELECT pg_typeof(100);

Résultat :

integer

Chaînes arbitraires

Dans Postgres, il existe plusieurs types de chaîne (par exemple, char , varchar , text ). Par conséquent, vous ne pouvez pas simplement entourer un argument de guillemets simples et vous attendre à ce qu'il sache quel est son type de données.

SELECT pg_typeof('Elephant'); 

Résultat :

unknown

Par conséquent, vous devrez spécifier son type de données réel.

SELECT pg_typeof('Elephant'::varchar); 

Résultat :

character varying

Dans Postgres, character varying est le nom de varchar (en fait, varchar est l'alias pour character varying ).

Ce dernier exemple était un peu superflu, car j'ai explicitement indiqué le type de variable, ce qui signifiait que je savais déjà quel serait le résultat.

Dans le monde réel, il est plus probable que vous essayiez d'obtenir le type de données d'une variable.

Type de retour d'une variable

Dans cet exemple, je mets la chaîne précédente dans une variable, puis j'obtiens son type de données.

DO $$
DECLARE myString varchar(10) := 'Elephant';
BEGIN
 raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$

Résultat :

NOTICE: Value: Elephant
Type: character varying

Le voici à nouveau, sauf que je change le type de données en un type de chaîne différent (char(8) ).

DO $$
DECLARE myString char(8) := 'Elephant';
BEGIN
 raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$

Résultat :

NOTICE: Value: Elephant
Type: character

Valeurs booléennes

Voici un exemple de fourniture explicite d'une valeur booléenne.

SELECT 
  pg_typeof(true),
  pg_typeof(false); 

Résultat :

 pg_typeof | pg_typeof
-----------+-----------
   boolean | boolean

Type de retour d'une fonction

Encore une fois, il est peu probable que vous fournissiez explicitement true ou false à cette fonction. Il est plus probable que cela provienne d'une variable.

Mais vous pouvez également utiliser pg_typeof() pour connaître le type de retour d'une fonction.

Voici un exemple.

SELECT pg_typeof(isfinite(date '2020-07-18'));

Résultat :

boolean

Dans ce cas, j'ai passé le isfinite() fonction à pg_typeof() fonctionner comme son argument.

Et voici un autre exemple. Dans celui-ci, j'obtiens le type de données de la valeur de retour du make_date() fonction.

SELECT pg_typeof(make_date('1999', '09', '19')); 

Résultat :

date

Type de données d'une colonne

Voici un exemple de renvoi du type de données d'une colonne de base de données.

SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;

Résultat :

timestamp without time zone

Dans ce cas, j'ai vérifié le type de données du actor.last_update colonne dans la pagila exemple de base de données.

Vérifions une autre colonne :

SELECT pg_typeof(name)
FROM language
LIMIT 1;

Résultat :

character

Cette colonne s'affiche sous la forme bpchar dans mon interface, qui est apparemment le nom de type interne pour CHAR(n) .

Au fait, vous pouvez interroger information_schema.columns pour le type de données d'une colonne.

Par conséquent, nous pourrions utiliser la requête suivante à la place :

SELECT 
  column_name, 
  data_type 
FROM information_schema.columns
WHERE table_name = 'language';

Résultat :

 column_name |          data_type          
-------------+-----------------------------
 language_id | integer
 name        | character
 last_update | timestamp without time zone

Dans ce cas, j'ai renvoyé le type de données pour toutes les colonnes de la table.