Référence DDSQL

Disponible pour:

Éditeur DDSQL | Notebooks

Aperçu

DDSQL est SQL pour les données Datadog. Il implémente plusieurs opérations SQL standard, telles que SELECT, et permet des requêtes sur des données non structurées. Vous pouvez effectuer des actions comme obtenir exactement les données que vous souhaitez en écrivant votre propre instruction SELECT, ou interroger des tags comme s’ils étaient des colonnes de table standard.

Vous pouvez exécuter des requêtes DDSQL à partir d’agents AI en utilisant l’ensemble d’outils Datadog MCP Server ddsql (Aperçu).

Cette documentation couvre le support SQL disponible et inclut :

Exemple de cellule de travail avec syntaxe SQL

Syntaxe

La syntaxe SQL suivante est prise en charge :

SELECT (DISTINCT) (DISTINCT: Optionnel)
Récupère des lignes d’une base de données, en DISTINCT filtrant les enregistrements en double.
SELECT DISTINCT customer_id
FROM orders 
JOIN
Combine des lignes de deux tables ou plus en fonction d’une colonne liée entre elles. Prend en charge FULL JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN.
SELECT orders.order_id, customers.customer_name
FROM orders
JOIN customers
ON orders.customer_id = customers.customer_id 
GROUP BY
Regroupe les lignes ayant les mêmes valeurs dans des colonnes spécifiées en lignes de résumé.
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id 
|| (concat)
Concatène deux chaînes ou plus ensemble.
SELECT first_name || ' ' || last_name AS full_name
FROM employees 
WHERE (Inclut le support pour LIKE, IN, ON, OR filtres)
Filtre les enregistrements qui répondent à une condition spécifiée.
SELECT *
FROM employees
WHERE department = 'Sales' AND name LIKE 'J%' 
CASE
Fournit une logique conditionnelle pour renvoyer différentes valeurs en fonction des conditions spécifiées.
SELECT order_id,
  CASE
    WHEN quantity > 10 THEN 'Bulk Order'
    ELSE 'Standard Order'
  END AS order_type
FROM orders 
WINDOW
Effectue un calcul sur un ensemble de lignes de table qui sont liées à la ligne actuelle.
SELECT
  timestamp,
  service_name,
  cpu_usage_percent,
  AVG(cpu_usage_percent) OVER (PARTITION BY service_name ORDER BY timestamp ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg_cpu
FROM
  cpu_usage_data 
IS NULL / IS NOT NULL
Vérifie si une valeur est nulle ou non nulle.
SELECT *
FROM orders
WHERE delivery_date IS NULL 
LIMIT
Spécifie le nombre maximum d’enregistrements à renvoyer.
SELECT *
FROM customers
LIMIT 10 
OFFSET
Ignore un nombre spécifié d’enregistrements avant de commencer à renvoyer des enregistrements de la requête.
SELECT *
FROM employees
OFFSET 20 
ORDER BY
Trie l’ensemble des résultats d’une requête par une ou plusieurs colonnes. Inclut ASC, DESC pour l’ordre de tri.
SELECT *
FROM sales
ORDER BY sale_date DESC 
HAVING
Filtre les enregistrements qui répondent à une condition spécifiée après regroupement.
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id
HAVING SUM(quantity) > 10 
IN, ON, OR
Utilisé pour des conditions spécifiées dans les requêtes. Disponible dans les clauses WHERE, JOIN.
SELECT *
FROM orders
WHERE order_status IN ('Shipped', 'Pending') 
USING
Cette clause est un raccourci pour les jointures où les colonnes de jointure ont le même nom dans les deux tables. Elle prend une liste de ces colonnes séparées par des virgules et crée une condition d’égalité distincte pour chaque paire correspondante. Par exemple, joindre T1 et T2 avec USING (a, b) est équivalent à ON T1.a = T2.a AND T1.b = T2.b.
SELECT orders.order_id, customers.customer_name
FROM orders
JOIN customers
USING (customer_id) 
AS
Renomme une colonne ou une table avec un alias.
SELECT first_name AS name
FROM employees 
Opérations arithmétiques
Effectue des calculs de base en utilisant des opérateurs comme +, -, *, /.
SELECT price, tax, (price * tax) AS total_cost
FROM products 
INTERVAL value unit
Intervalle représentant une durée de temps spécifiée dans une unité donnée. Unités prises en charge :
- milliseconds / millisecond
- seconds / second
- minutes / minute
- hours / hour
- days / day

Types de données

DDSQL prend en charge les types de données suivants :

Type de donnéesDescription
BIGINTEntiers signés de 64 bits.
BOOLEANtrue ou false valeurs.
DECIMALNombres à virgule flottante.
INETValeurs d’adresse réseau (IPv4 et IPv6, avec longueur de préfixe CIDR optionnelle).
INTERVALValeurs de durée de temps.
JSONDonnées JSON.
TIMESTAMPValeurs de date et d’heure.
VARCHARChaînes de caractères de longueur variable.

Types de tableau

Tous les types de données prennent en charge les types de tableau. Voir Tableaux pour les littéraux de tableau, l’accès aux éléments et les fonctions de tableau.

Littéraux de type

DDSQL prend en charge les littéraux de type explicites en utilisant la syntaxe [TYPE] [value].

TypeSyntaxeExemple
BIGINTBIGINT 'value'BIGINT '1234567'
BOOLEANBOOLEAN 'value'BOOLEAN 'true'
DECIMALDECIMAL 'value'DECIMAL '3.14159'
INETINET 'value'INET '192.168.1.5/24'
INTERVALINTERVAL 'value unit'INTERVAL '30 minutes'
JSONJSON 'value'JSON '{"key": "value", "count": 42}'
TIMESTAMPTIMESTAMP 'value'TIMESTAMP '2023-12-25 10:30:00'
VARCHARVARCHAR 'value'VARCHAR 'hello world'

Le préfixe de type peut être omis et le type est automatiquement déduit de la valeur. Par exemple, 'hello world' est déduit comme VARCHAR, 123 comme BIGINT, et true comme BOOLEAN. Utilisez des préfixes de type explicites lorsque les valeurs pourraient être ambiguës ; par exemple, TIMESTAMP '2025-01-01' serait déduit comme VARCHAR sans le préfixe.

Exemple

-- Using type literals in queries
SELECT
    VARCHAR 'Product Name: ' || name AS labeled_name,
    price * DECIMAL '1.08' AS price_with_tax,
    created_at + INTERVAL '7 days' AS expiry_date
FROM products
WHERE created_at > TIMESTAMP '2025-01-01';

Tableaux

Les tableaux sont des collections ordonnées de valeurs qui partagent toutes le même type de données. Chaque type de base DDSQL a un type de tableau correspondant.

Littéraux de tableau

Utilisez la syntaxe ARRAY[value1, value2, ...] pour construire un littéral de tableau. Le type du tableau est automatiquement déduit des valeurs.

SELECT ARRAY['apple', 'banana', 'cherry'] AS fruits;  -- VARCHAR array
SELECT ARRAY[1, 2, 3] AS numbers;                     -- BIGINT array
SELECT ARRAY[true, false, true] AS flags;             -- BOOLEAN array
SELECT ARRAY[1.1, 2.2, 3.3] AS decimals;              -- DECIMAL array

Accès aux éléments

Accédez aux éléments individuels d’un tableau avec un indice basé sur 1. Accéder à un indice qui est hors limites renvoie NULL.

SELECT ARRAY['a', 'b', 'c'][1];   -- Returns 'a'
SELECT ARRAY['a', 'b', 'c'][2];   -- Returns 'b'
SELECT ARRAY['a', 'b', 'c'][10];  -- Returns NULL (out of bounds)

Pour accéder aux éléments d’une colonne de tableau, utilisez la même syntaxe d’indice :

SELECT recipients[1] AS first_recipient
FROM emails

Fonctions de tableau

Les fonctions suivantes opèrent sur des tableaux :

FonctionType de retourDescription
CARDINALITY(array a)BIGINTRenvoie le nombre d’éléments dans le tableau.
ARRAY_POSITION(array a, typeof_array value)BIGINTRenvoie l’indice basé sur 1 de la première occurrence de value dans le tableau, ou NULL si non trouvé.
STRING_TO_ARRAY(string s, string delimiter)VARCHAR[]Divise une chaîne en un tableau de chaînes sur le délimiteur donné.
ARRAY_TO_STRING(array a, string delimiter)VARCHARJoint les éléments du tableau en une chaîne avec le délimiteur donné.
ARRAY_AGG(expression e)tableau du type d’entréeAgrège les valeurs de plusieurs lignes dans un tableau.
UNNEST(array a [, array b...])lignes de a[, b…]Développe un ou plusieurs tableaux en un ensemble de lignes. Valide uniquement dans une clause FROM .

CARDINALITY

SELECT
  CARDINALITY(recipients) AS recipient_count
FROM
  emails

ARRAY_POSITION

SELECT
  ARRAY_POSITION(recipients, 'hello@example.com') AS position
FROM
  emails

STRING_TO_ARRAY

SELECT
  STRING_TO_ARRAY('a,b,c,d,e,f', ',') AS parts

ARRAY_TO_STRING

SELECT
  ARRAY_TO_STRING(ARRAY['a', 'b', 'c'], ',') AS joined_string

ARRAY_AGG

SELECT
  sender,
  ARRAY_AGG(subject) AS subjects,
  ARRAY_AGG(DISTINCT subject) AS distinct_subjects
FROM
  emails
GROUP BY
  sender

UNNEST

SELECT
  sender,
  recipient
FROM
  emails,
  UNNEST(recipients) AS recipient

Fonctions

Les fonctions SQL suivantes sont prises en charge. Pour la fonction de fenêtre, voir la section Fonction de fenêtre séparée dans cette documentation.

FonctionType de retourDescription
MIN(variable v)typeof vRenvoie la plus petite valeur dans un ensemble de données.
MAX(variable v)typeof vRenvoie la valeur maximale parmi toutes les valeurs d’entrée.
COUNT(any a)numericRenvoie le nombre de valeurs d’entrée qui ne sont pas nulles.
SUM(numeric n)numericRenvoie la somme de toutes les valeurs d’entrée.
AVG(numeric n)numericRenvoie la valeur moyenne (moyenne arithmétique) de toutes les valeurs d’entrée.
BOOL_AND(boolean b)booleanRenvoie si toutes les valeurs d’entrée non nulles sont vraies.
BOOL_OR(boolean b)booleanRenvoie si au moins une valeur d’entrée non nulle est vraie.
CEIL(numeric n) / CEILING(numeric n)numericRenvoie la valeur arrondie à l’entier supérieur le plus proche. Les deux CEIL et CEILING sont pris en charge en tant qu’alias.
FLOOR(numeric n)numericRenvoie la valeur arrondie à l’entier inférieur le plus proche.
ROUND(numeric n)numericRenvoie la valeur arrondie à l’entier le plus proche.
POWER(numeric base, numeric exponent)numericRenvoie la valeur de la base élevée à la puissance de l’exposant.
LOWER(string s)stringRenvoie la chaîne en minuscules.
UPPER(string s)stringRenvoie la chaîne en majuscules.
ABS(numeric n)numericRenvoie la valeur absolue.
COALESCE(args a)typeof first non-null a OR nullRenvoie la première valeur non nulle ou null si toutes sont nulles.
CAST(value AS type)typeConvertit la valeur donnée au type de données spécifié.
LENGTH(string s)integerRenvoie le nombre de caractères dans la chaîne.
TRIM(string s)stringSupprime les espaces blancs au début et à la fin de la chaîne.
REPLACE(string s, string from, string to)stringRemplace les occurrences d’une sous-chaîne dans une chaîne par une autre sous-chaîne.
SUBSTRING(string s, int start, int length)stringExtrait une sous-chaîne d’une chaîne, en commençant à une position donnée et pour une longueur spécifiée.
REVERSE(string s)stringRenvoie la chaîne avec les caractères dans l’ordre inverse.
STRPOS(string s, string substring)entierRenvoie la première position d’index de la sous-chaîne dans une chaîne donnée, ou 0 s’il n’y a pas de correspondance.
SPLIT_PART(string s, string delimiter, integer index)chaîneDivise la chaîne sur le délimiteur donné et renvoie la chaîne à la position spécifiée en comptant à partir de 1.
EXTRACT(unit from timestamp/interval)numériqueExtrait une partie d’un champ de date ou d’heure (comme l’année ou le mois) à partir d’un horodatage ou d’un intervalle.
TO_TIMESTAMP(string timestamp, string format)horodatageConvertit une chaîne en un horodatage selon le format donné.
TO_TIMESTAMP(numeric epoch)horodatageConvertit un horodatage d’époque UNIX (en secondes) en un horodatage.
TO_CHAR(timestamp t, string format)chaîneConvertit un horodatage en une chaîne selon le format donné.
DATE_BIN(interval stride, timestamp source, timestamp origin)horodatageAligne un horodatage (source) sur des seaux de longueur égale (pas). Renvoie le début du seau contenant la source, calculé comme le plus grand horodatage inférieur ou égal à la source et qui est un multiple du pas à partir de l’origine.
DATE_TRUNC(string unit, timestamp t)horodatageTronque un horodatage à une précision spécifiée en fonction de l’unité fournie.
CURRENT_SETTING(string setting_name)chaîneRenvoie la valeur actuelle du paramètre spécifié. Prend en charge les paramètres dd.time_frame_start et dd.time_frame_end, qui renvoient respectivement le début et la fin de la période de temps globale.
NOW()horodatageRenvoie l’horodatage UTC actuel au début de la requête actuelle.
CARDINALITY(array a)entierRenvoie le nombre d’éléments dans le tableau.
ARRAY_POSITION(array a, typeof_array value)entierRenvoie l’index de la première occurrence de la valeur trouvée dans le tableau, ou null si la valeur n’est pas trouvée.
STRING_TO_ARRAY(string s, string delimiter)tableau de chaînesDivise la chaîne donnée en un tableau de chaînes en utilisant le délimiteur donné.
ARRAY_TO_STRING(array a, string delimiter)chaîneConvertit un tableau en une chaîne en concaténant les éléments avec le délimiteur donné.
ARRAY_AGG(expression e)tableau de type d’entréeCrée un tableau en collectant toutes les valeurs d’entrée.
APPROX_PERCENTILE(double percentile) WITHIN GROUP (ORDER BY expression e)type d’expressionCalcule une valeur percentile approximative. Le percentile doit être compris entre 0,0 et 1,0 (inclus). Nécessite la syntaxe WITHIN GROUP (ORDER BY ...).
UNNEST(array a [, array b...])lignes d’un [, b…]Développe les tableaux en un ensemble de lignes. Cette forme n’est autorisée que dans une clause FROM.

MIN

SELECT MIN(response_time) AS min_response_time
FROM logs
WHERE status_code = 200

MAX

SELECT MAX(response_time) AS max_response_time
FROM logs
WHERE status_code = 200

COUNT

SELECT COUNT(request_id) AS total_requests
FROM logs
WHERE status_code = 200 

SUM

SELECT SUM(bytes_transferred) AS total_bytes
FROM logs
GROUP BY service_name

AVG

SELECT AVG(response_time)
AS avg_response_time
FROM logs
WHERE status_code = 200
GROUP BY service_name

BOOL_AND

SELECT BOOL_AND(status_code = 200) AS all_success
FROM logs

BOOL_OR

SELECT BOOL_OR(status_code = 200) AS some_success
FROM logs

CEIL

SELECT CEIL(price) AS rounded_price
FROM products

FLOOR

SELECT FLOOR(price) AS floored_price
FROM products

ROUND

SELECT ROUND(price) AS rounded_price
FROM products

POWER

SELECT POWER(response_time, 2) AS squared_response_time
FROM logs

LOWER

SELECT LOWER(customer_name) AS lowercase_name
FROM customers

UPPER

SELECT UPPER(customer_name) AS uppercase_name
FROM customers

ABS

SELECT ABS(balance) AS absolute_balance
FROM accounts

COALESCE

SELECT COALESCE(phone_number, email) AS contact_info
FROM users

CAST

Types cibles de conversion pris en charge :

  • BIGINT
  • DECIMAL
  • INET
  • TIMESTAMP
  • VARCHAR
SELECT
  CAST(order_id AS VARCHAR) AS order_id_string,
  'Order-' || CAST(order_id AS VARCHAR) AS order_label
FROM
  orders

LENGTH

SELECT
  customer_name,
  LENGTH(customer_name) AS name_length
FROM
  customers

INTERVAL

SELECT
  TIMESTAMP '2023-10-01 10:00:00' + INTERVAL '30 days' AS future_date,
  INTERVAL '1 MILLISECOND 2 SECONDS 3 MINUTES 4 HOURS 5 DAYS'

TRIM

SELECT
  TRIM(name) AS trimmed_name
FROM
  users

REPLACE

SELECT
  REPLACE(description, 'old', 'new') AS updated_description
FROM
  products

SUBSTRING

SELECT
  SUBSTRING(title, 1, 10) AS short_title
FROM
  books

REVERSE

SELECT
  REVERSE(username) AS reversed_username
FROM
  users
LIMIT 5

STRPOS

SELECT
  STRPOS('foobar', 'bar')

SPLIT_PART

SELECT
  SPLIT_PART('aaa-bbb-ccc', '-', 2)

EXTRACT

Unités d’extraction prises en charge :

LittéralType d’entréeDescription
daytimestamp / intervaljour du mois
dowtimestampjour de la semaine 1 (lundi) à 7 (dimanche)
doytimestampjour de l’année (1 - 366)
epochtimestamp / intervalsecondes depuis 1970-01-01 00:00:00 UTC (pour les horodatages), ou nombre total de secondes (pour les intervalles)
hourtimestamp / intervalheure de la journée (0 - 23)
minutetimestamp / intervalminute de l’heure (0 - 59)
secondtimestamp / intervalseconde de la minute (0 - 59)
weektimestampsemaine de l’année (1 - 53)
monthtimestampmois de l’année (1 - 12)
quartertimestamptrimestre de l’année (1 - 4)
yeartimestampannée
timezone_hourtimestampheure du décalage horaire
timezone_minutetimestampminute du décalage horaire
SELECT
  EXTRACT(year FROM purchase_date) AS purchase_year
FROM
  sales
-- Get the Unix epoch of a timestamp
SELECT EXTRACT(epoch FROM TIMESTAMP '2021-01-01 00:00:00+00')
-- Returns: 1609459200
-- Get the total seconds in an interval
SELECT EXTRACT(epoch FROM INTERVAL '1 day 2 hours')
-- Returns: 93600
-- Calculate how many seconds ago each event occurred
SELECT
  event_time,
  EXTRACT(epoch FROM now()) - EXTRACT(epoch FROM event_time) AS seconds_ago
FROM
  events

TO_TIMESTAMP

TO_TIMESTAMP a deux formes :

Forme 1 : Convertir une chaîne en horodatage avec le format

Modèles pris en charge pour le formatage de date/heure :

ModèleDescription
YYYYannée (4 chiffres)
YYannée (2 chiffres)
MMnuméro de mois (01 - 12)
DDjour du mois (01 - 31)
HH24heure du jour (00 - 23)
HH12heure du jour (01 - 12)
HHheure du jour (01 - 12)
MIminute (00 - 59)
SSseconde (00 - 59)
MSmilliseconde (000 - 999)
TZabréviation de fuseau horaire
OFdécalage horaire par rapport à UTC
AM / amindicateur de méridien (sans points)
PM / pmindicateur de méridien (sans points)
SELECT
  TO_TIMESTAMP('25/12/2025 04:23 pm', 'DD/MM/YYYY HH:MI am') AS ts

Forme 2 : Convertir le timestamp UNIX en timestamp

SELECT
  TO_TIMESTAMP(1735142580) AS ts_from_epoch

TO_CHAR

Modèles pris en charge pour le formatage de date/heure :

ModèleDescription
YYYYannée (4 chiffres)
YYannée (2 chiffres)
MMnuméro de mois (01 - 12)
DDjour du mois (01 - 31)
HH24heure du jour (00 - 23)
HH12heure du jour (01 - 12)
HHheure du jour (01 - 12)
MIminute (00 - 59)
SSseconde (00 - 59)
MSmilliseconde (000 - 999)
TZabréviation de fuseau horaire
OFdécalage horaire par rapport à UTC
AM / amindicateur de méridien (sans points)
PM / pmindicateur de méridien (sans points)
SELECT
  TO_CHAR(order_date, 'MM-DD-YYYY') AS formatted_date
FROM
  orders

DATE_BIN

SELECT DATE_BIN('15 minutes', TIMESTAMP '2025-09-15 12:34:56', TIMESTAMP '2025-01-01')
-- Returns 2025-09-15 12:30:00

SELECT DATE_BIN('1 day', TIMESTAMP '2025-09-15 12:34:56', TIMESTAMP '2025-01-01')
-- Returns 2025-09-15 00:00:00

DATE_TRUNC

Tronquages pris en charge :

  • milliseconds
  • seconds / second
  • minutes / minute
  • hours / hour
  • days / day
  • weeks / week
  • months / month
  • quarters / quarter
  • years / year
SELECT
  DATE_TRUNC('month', event_time) AS month_start
FROM
  events

CURRENT_SETTING

Paramètres de configuration pris en charge :

  • dd.time_frame_start : Renvoie le début de la période sélectionnée au format RFC 3339 (YYYY-MM-DD HH:mm:ss.sss±HH:mm).
  • dd.time_frame_end : Renvoie la fin de la période sélectionnée au format RFC 3339 (YYYY-MM-DD HH:mm:ss.sss±HH:mm).
-- Define the current analysis window
WITH bounds AS (
  SELECT CAST(CURRENT_SETTING('dd.time_frame_start') AS TIMESTAMP) AS time_frame_start,
         CAST(CURRENT_SETTING('dd.time_frame_end')   AS TIMESTAMP) AS time_frame_end
),
-- Define the immediately preceding window of equal length
     previous_bounds AS (
  SELECT time_frame_start - (time_frame_end - time_frame_start) AS prev_time_frame_start,
         time_frame_start                                       AS prev_time_frame_end
  FROM bounds
)
SELECT * FROM bounds, previous_bounds

NOW

SELECT
  *
FROM
  sales
WHERE
  purchase_date > NOW() - INTERVAL '1 hour'

APPROX_PERCENTILE

-- Calculate the median (50th percentile) response time
SELECT
  APPROX_PERCENTILE(0.5) WITHIN GROUP (ORDER BY response_time) AS median_response_time
FROM
  logs

-- Calculate 95th and 99th response time percentiles by service
SELECT
  service_name,
  APPROX_PERCENTILE(0.95) WITHIN GROUP (ORDER BY response_time) AS p95_response_time,
  APPROX_PERCENTILE(0.99) WITHIN GROUP (ORDER BY response_time) AS p99_response_time
FROM
  logs
GROUP BY
  service_name

Expressions régulières

Variantes

Toutes les fonctions d’expressions régulières (regex) utilisent la variante des Composants Internationaux pour Unicode (ICU) :

Fonctions

FonctionType de retourDescription
REGEXP_LIKE(string input, string pattern)BooléenÉvalue si une chaîne correspond à un motif d’expression régulière.
REGEXP_MATCH(string input, string pattern [, string flags ])tableau de chaînesRenvoie les sous-chaînes de la première correspondance de motif dans la chaîne.

Cette fonction recherche la chaîne d’entrée en utilisant le motif donné et renvoie les sous-chaînes capturées (groupes de capture) de la première correspondance. Si aucun groupe de capture n’est présent, renvoie la correspondance complète.
REGEXP_REPLACE(string input, string pattern, string replacement [, string flags ])chaîneRemplace la sous-chaîne correspondant à la première occurrence du motif, ou toutes ces occurrences si vous utilisez le flag optionnel g
REGEXP_REPLACE (string input, string pattern, string replacement, integer start, integer N [, string flags ] )chaîneRemplace la sous-chaîne qui est la N-ième correspondance au motif, ou toutes ces correspondances si N est zéro, en commençant par start.

REGEXP_LIKE

SELECT
  *
FROM
  emails
WHERE
  REGEXP_LIKE(email_address, '@example\.com$')

REGEXP_MATCH

SELECT regexp_match('foobarbequebaz', '(bar)(beque)');
-- {bar,beque}

SELECT regexp_match('foobarbequebaz', 'barbeque');
-- {barbeque}

SELECT regexp_match('abc123xyz', '([a-z]+)(\d+)(x(.)z)');
-- {abc,123,xyz,y}

REGEXP_REPLACE

SELECT regexp_replace('Auth success token=abc123XYZ789', 'token=\w+', 'token=***');
-- Auth success token=***

SELECT regexp_replace('status=200 method=GET', 'status=(\d+) method=(\w+)', '$2: $1');
-- GET: 200

SELECT regexp_replace('INFO INFO INFO', 'INFO', 'DEBUG', 1, 2);
-- INFO DEBUG INFO

Drapeaux au niveau de la fonction

Vous pouvez utiliser les drapeaux suivants avec les fonctions d’expressions régulières :

i
Correspondance insensible à la casse
n ou m
Correspondance sensible aux nouvelles lignes
g
Global; remplace toutes les sous-chaînes correspondantes plutôt que seulement la première.

i drapeau

SELECT regexp_match('INFO', 'info')
-- NULL

SELECT regexp_match('INFO', 'info', 'i')
-- ['INFO']

n drapeau

SELECT regexp_match('a
b', '^b');
-- NULL

SELECT regexp_match('a
b', '^b', 'n');
-- ['b']

g drapeau

SELECT icu_regexp_replace('Request id=12345 completed, id=67890 pending', 'id=\d+', 'id=XXX');
-- Request id=XXX completed, id=67890 pending

SELECT regexp_replace('Request id=12345 completed, id=67890 pending', 'id=\d+', 'id=XXX', 'g');
-- Request id=XXX completed, id=XXX pending

Fonctions de fenêtre

Ce tableau fournit un aperçu des fonctions de fenêtre prises en charge. Pour des détails complets et des exemples, consultez la documentation PostgreSQL.

FonctionType de retourDescription
OVERN/ADéfinit une fenêtre pour un ensemble de lignes sur lesquelles d’autres fonctions de fenêtre peuvent opérer.
PARTITION BYN/ADivise l’ensemble des résultats en partitions, spécifiquement pour appliquer des fonctions de fenêtre.
RANK()entierAttribue un rang à chaque ligne au sein d’une partition, avec des lacunes pour les égalités.
ROW_NUMBER()entierAttribue un numéro séquentiel unique à chaque ligne au sein d’une partition.
LEAD(column n)type de colonneRenvoie la valeur de la ligne suivante dans la partition.
LAG(column n)type de colonneRenvoie la valeur de la ligne précédente dans la partition.
FIRST_VALUE(column n)type de colonneRenvoie la première valeur dans un ensemble ordonné de valeurs.
LAST_VALUE(column n)type de colonneRenvoie la dernière valeur dans un ensemble ordonné de valeurs.
NTH_VALUE(column n, offset)type de colonneRenvoie la valeur à l’offset spécifié dans un ensemble ordonné de valeurs.

Fonctions et opérateurs JSON

NomType de retourDescription
json_extract_path_text(text json, text path…)texteExtrait un sous-objet JSON sous forme de texte, défini par le chemin. Son comportement est équivalent à la fonction Postgres du même nom. Par exemple, json_extract_path_text(col, ‘forest') renvoie la valeur de la clé forest pour chaque objet JSON dans col. Voir l’exemple ci-dessous pour une syntaxe de tableau JSON.
json_extract_path(text json, text path…)JSONMême fonctionnalité que json_extract_path_text, mais renvoie une colonne de type JSON au lieu de type texte.
json_array_elements(text json)lignes de JSONDéveloppe un tableau JSON en un ensemble de lignes. Cette forme n’est autorisée que dans une clause FROM.
json_array_elements_text(text json)lignes de résultatTransforme un tableau JSON en un ensemble de lignes. Cette forme n’est autorisée que dans une clause FROM.

Fonctions et opérateurs d’adresse réseau

Le type inet représente les adresses réseau IPv4 et IPv6 avec une longueur de préfixe CIDR optionnelle (par exemple, 192.168.1.5/24 ou ::1). Créez des valeurs inet avec la syntaxe littérale de type INET 'value' ou en convertissant une chaîne avec CAST(column AS inet).

Fonctions

FonctionType de retourDescription
host(inet addr)VARCHARRenvoie l’adresse IP sous forme de texte, sans la longueur de préfixe.
network(inet addr)INETRenvoie la partie réseau de l’adresse, avec les bits d’hôte mis à zéro.
netmask(inet addr)INETRenvoie le masque réseau pour l’adresse.
masklen(inet addr)BIGINTRenvoie la longueur de préfixe du masque réseau.
broadcast(inet addr)INETRenvoie l’adresse de diffusion du réseau.
family(inet addr)BIGINTRenvoie la famille d’adresses : 4 pour IPv4, 6 pour IPv6.

Opérateurs

OpérateurType de retourDescription
inet a << inet bBOOLEANRenvoie true si a est strictement contenu dans b.
inet a <<= inet bBOOLEANRenvoie true si a est contenu dans ou égal à b.
inet a >> inet bBOOLEANRenvoie true si a contient strictement b.
inet a >>= inet bBOOLEANRenvoie true si a contient ou est égal à b.
inet a && inet bBOOLEANRenvoie true si les sous-réseaux de a et b se chevauchent.

host

SELECT host(INET '192.168.1.5/24')
-- Returns: 192.168.1.5

network

SELECT network(INET '192.168.1.5/24')
-- Returns: 192.168.1.0/24

netmask

SELECT netmask(INET '192.168.1.5/24')
-- Returns: 255.255.255.0

masklen

SELECT masklen(INET '192.168.1.5/24')
-- Returns: 24

broadcast

SELECT broadcast(INET '192.168.1.5/24')
-- Returns: 192.168.1.255/24

family

SELECT family(INET '::1')
-- Returns: 6

SELECT family(INET '192.168.1.5')
-- Returns: 4

Opérateurs de contenance

-- Check if an IP is within a subnet
SELECT INET '192.168.1.5' << INET '192.168.1.0/24'
-- Returns: true

-- Check containment or equality
SELECT INET '192.168.1.0/24' <<= INET '192.168.1.0/24'
-- Returns: true

-- Check if a subnet contains an IP
SELECT INET '10.0.0.0/8' >> INET '10.1.2.3'
-- Returns: true

-- Check if two subnets overlap
SELECT INET '192.168.1.0/24' && INET '192.168.1.128/25'
-- Returns: true

Utilisation combinée

-- Find all IPs in a private subnet and extract network info
SELECT
  host(CAST(src_ip AS inet)) AS ip,
  masklen(CAST(src_ip AS inet)) AS prefix_len,
  network(CAST(src_ip AS inet)) AS network
FROM connections
WHERE CAST(src_ip AS inet) << INET '10.0.0.0/8'
  AND family(CAST(src_ip AS inet)) = 4

Fonctions de table

Les fonctions de table sont utilisées pour interroger les journaux, les métriques, les coûts cloud et d’autres sources de données.

FonctionDescriptionExemple
dd.logs(
    colonnes => tableau < varchar >,
    filtre ? => varchar,
    index ? => tableau < varchar >,
    stockage ? => varchar,
    depuis_timestamp ? => timestamp,
    vers_timestamp ? => timestamp
) EN (nom_colonne type [, ...])
Renvoie les données de journal sous forme de tableau. Le paramètre colonnes spécifie quels champs de journal extraire. Les champs imbriqués sont accessibles en utilisant la notation par points, et les champs non principaux doivent être précédés par @. La clause AS définit le schéma du tableau renvoyé. Optionnel : filtrage par index ou plage horaire. Lorsque le temps n'est pas spécifié, DDSQL utilise par défaut le paramètre de temps global, qui dans l'éditeur DDSQL est réglé sur la dernière heure. Optionnel : spécifier le stockage à utiliser (par exemple, hot, flex_tier). Si non spécifié, la valeur par défaut est le hot storage.
SELECT timestamp, host, service, message, asset_id
FROM dd.logs(
    filter  => 'source:java',
    columns => ARRAY['timestamp','host','service','message','@asset.id']
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    service   VARCHAR,
    message   VARCHAR,
    asset_id  VARCHAR
)
dd.metrics_scalar(
    query varchar,
    réducteur varchar [, depuis_timestamp timestamp, vers_timestamp timestamp]
)
Renvoie des données métriques sous forme de valeur scalaire. La fonction accepte une requête de métriques (avec regroupement optionnel), un réducteur pour déterminer comment les valeurs sont agrégées (moyenne, maximum, etc.), et des paramètres de timestamp optionnels (par défaut 1 heure) pour définir la plage horaire.
SELECT *
FROM dd.metrics_scalar(
    'avg:system.cpu.user{*} by {service}',
    'avg',
    TIMESTAMP '2025-07-10 00:00:00.000-04:00',
    TIMESTAMP '2025-07-17 00:00:00.000-04:00'
)
ORDER BY value DESC;
dd.metrics_timeseries(
    requête varchar [, from_timestamp timestamp, to_timestamp timestamp]
)
Renvoie les données métriques sous forme de série temporelle. La fonction accepte une requête de métriques (avec regroupement optionnel) et des paramètres d'horodatage optionnels (par défaut 1 heure) pour définir la plage temporelle. Renvoie des points de données au fil du temps plutôt qu'une seule valeur agrégée.
SELECT *
FROM dd.metrics_timeseries(
    'avg:system.cpu.user{*} by {service}',
    TIMESTAMP '2025-07-10 00:00:00.000-04:00',
    TIMESTAMP '2025-07-17 00:00:00.000-04:00'
)
ORDER BY timestamp, service;
dd.cloud_cost_scalar(
    requête varchar,
    réducteur varchar
    [, from_timestamp timestamp,
    to_timestamp timestamp]
)
Renvoie des données de coût cloud sous forme de valeur scalaire. La fonction accepte une requête de coût cloud (avec regroupement optionnel), un réducteur d'agrégation (utilisez sum pour les données de coût ; d'autres réducteurs tels que avg, min, et max sont acceptés mais rarement applicables aux requêtes de coût), et des paramètres timestamp optionnels (par défaut 1 heure) pour définir la plage temporelle. Remarque : Les données de coût cloud sont généralement retardées de 24 à 48 heures, donc les timestamps récents peuvent ne renvoyer aucun résultat.
SELECT *
FROM dd.cloud_cost_scalar(
    'sum:all.cost{*} by {service}',
    'sum',
    TIMESTAMP '2025-07-10 00:00:00.000-04:00',
    TIMESTAMP '2025-07-17 00:00:00.000-04:00'
)
ORDER BY value DESC;
dd.cloud_cost_timeseries(
    requête varchar
    [, from_timestamp timestamp,
    to_timestamp timestamp]
)
Renvoie des données de coût cloud sous forme de série temporelle. La fonction accepte une requête de coût cloud (avec regroupement optionnel) et des paramètres timestamp optionnels (par défaut 1 heure) pour définir la plage temporelle. Renvoie des points de données de coût au fil du temps plutôt qu'une seule valeur agrégée. Remarque : Les données de coût cloud sont généralement retardées de 24 à 48 heures, donc les timestamps récents peuvent ne retourner aucun résultat.
SELECT *
FROM dd.cloud_cost_timeseries(
    'sum:all.cost{*} by {service}',
    TIMESTAMP '2025-07-10 00:00:00.000-04:00',
    TIMESTAMP '2025-07-17 00:00:00.000-04:00'
)
ORDER BY timestamp, service;

Absolute timestamps

SELECT *
FROM dd.logs(
    columns => ARRAY['timestamp','host','service','message'],
    from_timestamp => TIMESTAMP '2025-07-10 00:00:00.000-04:00',
    to_timestamp => TIMESTAMP '2025-07-17 00:00:00.000-04:00'
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    service   VARCHAR,
    message   VARCHAR
)

Relative timestamps

SELECT *
FROM dd.logs(
    columns => ARRAY['timestamp','host','service','message'],
    from_timestamp => now() - INTERVAL '7 days',
    to_timestamp => now()
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    service   VARCHAR,
    message   VARCHAR
)

Paramètres optionnels

SELECT *
FROM dd.logs(
    columns => ARRAY['timestamp','host','service','message'],
    filter  => 'source:java',
    indexes => ARRAY['trino'],
    storage => 'hot'
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    service   VARCHAR,
    message   VARCHAR
)

Accès aux champs imbriqués

Les alias de colonnes ne peuvent pas contenir de points ; remplacez-les par des underscores ou tout autre caractère valide lors de la définition de l’alias.

SELECT timestamp, host, asset_id, view_url, data_resource_type
FROM dd.logs(
    filter  => 'service:mcp',
    columns => ARRAY['timestamp','host','@asset.id','@view.url','@data.resource.type']
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    asset_id  VARCHAR,
    view_url  VARCHAR,
    data_resource_type VARCHAR
)

Étiquettes

DDSQL expose les étiquettes comme un hstore type, inspiré de PostgreSQL. Vous pouvez accéder aux valeurs pour des clés d’étiquettes spécifiques en utilisant l’opérateur flèche de PostgreSQL. Exemple :

SELECT instance_type, count(instance_type)
FROM aws.ec2_instance
WHERE tags->'region' = 'us-east-1' -- region is a tag, not a column
GROUP BY instance_type

Les étiquettes sont des paires clé-valeur où chaque clé peut avoir zéro, une ou plusieurs valeurs d’étiquettes correspondantes. Lorsqu’elle est accédée, la valeur de l’étiquette renvoie une seule chaîne, contenant toutes les valeurs correspondantes. Lorsque les données ont plusieurs valeurs d’étiquettes pour la même clé d’étiquette, elles sont représentées sous forme de chaîne triée, séparée par des virgules. Exemple :

SELECT tags->'team', instance_type, architecture, COUNT(*) as instance_count
FROM aws.ec2_instance
WHERE tags->'team' = 'compute_provisioning,database_ops'
GROUP BY tags->'team', instance_type, architecture
ORDER BY instance_count DESC

Vous pouvez également comparer les valeurs d’étiquettes en tant que chaînes ou ensembles d’étiquettes entiers :

SELECT *
FROM k8s.daemonsets da INNER JOIN k8s.deployments de
ON da.tags = de.tags -- for a specific tag: da.tags->'app' = de.tags->'app'

De plus, vous pouvez extraire les clés et les valeurs d’étiquettes dans des tableaux individuels de texte :

SELECT akeys(tags), avals(tags)
FROM aws.ec2_instance

Fonctions et opérateurs HSTORE

NomType de retourDescription
tags -> ’text'TexteObtient la valeur pour une clé donnée. Renvoie null si la clé n’est pas présente.
akeys(hstore tags)Tableau de texteObtient les clés d’un HSTORE sous forme de tableau
avals(hstore tags)Tableau de texteObtient les valeurs d’un HSTORE sous forme de tableau

Lectures complémentaires

Documentation, liens et articles supplémentaires utiles: