sql >> Database >  >> RDS >> PostgreSQL

Hoe pg_typeof() werkt in PostgreSQL

In PostgreSQL is de pg_typeof() functie stelt u in staat om het gegevenstype van elke waarde te krijgen.

Meer specifiek retourneert het de OID van het gegevenstype van de waarde die eraan wordt doorgegeven. Het retourneert een regtype , wat een OID-aliastype is. Daarom is het hetzelfde als een OID voor vergelijkingsdoeleinden, maar wordt het weergegeven als een typenaam.

Syntaxis

De functie heeft de volgende syntaxis:

pg_typeof(any)

Waar any enige waarde is.

Voorbeeld

Hier is een eenvoudig voorbeeld om te demonstreren.

SELECT pg_typeof(100);

Resultaat:

integer

Willekeurige tekenreeksen

In Postgres is er meer dan één type tekenreeks (bijv. char , varchar , text ). Daarom kun je een argument niet zomaar tussen enkele aanhalingstekens plaatsen en verwachten dat het weet wat het gegevenstype is.

SELECT pg_typeof('Elephant'); 

Resultaat:

unknown

Daarom moet u het werkelijke gegevenstype opgeven.

SELECT pg_typeof('Elephant'::varchar); 

Resultaat:

character varying

In Postgres, character varying is de naam voor varchar (eigenlijk varchar is de alias voor character varying ).

Dit laatste voorbeeld was een beetje overbodig, omdat ik het variabele type expliciet vermeldde, waardoor ik al wist wat het resultaat zou worden.

In de echte wereld is de kans groter dat u probeert het gegevenstype van een variabele te krijgen.

Retourtype van een variabele

In dit voorbeeld plaats ik de vorige string in een variabele en haal dan het datatype op.

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

Resultaat:

NOTICE: Value: Elephant
Type: character varying

Hier is het weer, behalve dat ik het gegevenstype verander in een ander tekenreekstype (char(8) ).

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

Resultaat:

NOTICE: Value: Elephant
Type: character

Booleaanse waarden

Hier is een voorbeeld van het expliciet verstrekken van een booleaanse waarde.

SELECT 
  pg_typeof(true),
  pg_typeof(false); 

Resultaat:

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

Retourtype van een functie

Nogmaals, het is onwaarschijnlijk dat u expliciet true opgeeft of false aan deze functie. Het is waarschijnlijker dat het van een variabele komt.

Maar je zou ook pg_typeof() . kunnen gebruiken om het retourtype van een functie te achterhalen.

Hier is een voorbeeld.

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

Resultaat:

boolean

In dit geval heb ik de isfinite() . doorgegeven functie naar de pg_typeof() functioneren als zijn argument.

En hier is nog een voorbeeld. In deze krijg ik het gegevenstype van de retourwaarde van de make_date() functie.

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

Resultaat:

date

Gegevenstype van een kolom

Hier is een voorbeeld van het retourneren van het gegevenstype van een databasekolom.

SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;

Resultaat:

timestamp without time zone

In dit geval heb ik het datatype van de actor.last_update . gecontroleerd kolom in de pagila voorbeelddatabase.

Laten we een andere kolom bekijken:

SELECT pg_typeof(name)
FROM language
LIMIT 1;

Resultaat:

character

Deze kolom wordt weergegeven als bpchar in mijn interface, wat blijkbaar de interne typenaam is voor CHAR(n) .

Trouwens, je kunt information_schema.columns . opvragen voor het gegevenstype van een kolom.

Daarom zouden we in plaats daarvan de volgende query kunnen gebruiken:

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

Resultaat:

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

In dit geval heb ik het gegevenstype voor alle kolommen in de tabel geretourneerd.


  1. Hoe wijzig ik de standaardwaarde van de kolom in PostgreSQL?

  2. PHP Fatale fout:Klasse 'PDO' niet gevonden

  3. Kan een tabelveld een koppelteken bevatten?

  4. Waarom de Optimizer geen kennis van bufferpools gebruikt?