Un type distinct est un type de données défini par l'utilisateur dont la représentation interne est commune avec celle d'un type existant (son type "source"), mais considéré comme distinct et incompatible pour la plupart des opérations. Par exemple, il est possible de définir un type Age, un type Poids et un type Taille, utilisant chacun une sémantique différente, mais partageant le même type de données intégré, INTEGER, pour leurs représentations internes.
L'exemple suivant illustre la création d'un type distinct, nommé PAY :
CREATE DISTINCT TYPE PAY AS DECIMAL(9,2) WITH COMPARISONS
Bien que PAY ait la même représentation que le type de données intégré DECIMAL(9,2), il est considéré comme un type distinct non compatible avec un type DECIMAL(9,2) ou tout autre type. Il ne peut être comparé qu'au même type distinct. En outre, les opérateurs et fonctions qui fonctionneraient avec le type DECIMAL ne s'appliquent pas ici. Par exemple, une valeur de type PAY ne peut pas être multipliée par une valeur de type INTEGER. Il faut donc dans ce cas écrire des fonctions ne s'appliquant qu'au type PAY.
L'utilisation de types de données distincts limite les erreurs accidentelles. Par exemple, si la colonne SALARY de la table EMPLOYEE a été définie comme type de données PAY, elle ne peut pas être ajoutée à COMM, même si les types source sont les mêmes.
Les types de données distincts prennent en charge le transtypage. Un type source peut être converti en type de données distinct et un type de données distinct en type source. Par exemple, si la colonne SALARY de la table EMPLOYEE a été définie comme étant de type PAY, il n'y aura pas, dans l'exemple suivant, d'erreur sur l'opérateur de comparaison.
SELECT * FROM EMPLOYEE WHERE DECIMAL(SALARY) = 41250
DECIMAL(SALARY) renvoie un type de données décimal. Inversement, un type de données numérique peut être converti en type PAY. Par exemple, il est possible d'utiliser PAY(41250) pour convertir le nombre 41250.