SEARCH_IP¶
Recherches d’adresses IPv4 valides dans des colonnes de chaînes de caractères spécifiées à partir d’une ou plusieurs tables, y compris des champs dans des colonnes VARIANT, OBJECT et ARRAY. La recherche est basée sur une seule adresse IP ou une plage d’adresses IP que vous spécifiez. Si cette adresse IP correspond à une adresse IP dans la colonne ou le champ spécifié, la fonction renvoie TRUE.
Pour plus d’informations sur l’utilisation de ces fonctions, voir Utilisation de la recherche en texte intégral.
Syntaxe¶
SEARCH_IP( <search_data>, <search_string> )
Arguments¶
search_data
Les données que vous souhaitez rechercher, exprimées sous la forme d’une liste délimitée par des virgules de littéraux de chaîne, de noms de colonnes ou chemins vers les champs dans les colonnes VARIANT. Les données de recherche peuvent également être une chaîne littérale unique, ce qui peut être utile lorsque vous testez la fonction.
Vous pouvez spécifier le caractère générique (
*
), où*
s’étend à toutes les colonnes éligibles dans toutes les tables concernées par la fonction. Les colonnes éligibles sont celles qui ont les types de données VARCHAR (texte), VARIANT, ARRAY et OBJECT. Les données VARIANT, ARRAY et OBJECT sont converties en texte pour la recherche. Vous pouvez également utiliser les mots-clés ILIKE et EXCLUDE pour le filtrage.Pour plus d’informations sur cet argument, voir la
search_data
description de la fonction SEARCH.search_string
Une chaîne VARCHAR contenant l’un des éléments suivants :
Une adresse IP complète et valide au format standard IPv4, par exemple
192.0.2.1
.Une adresse IP valide au format standard IPv4 avec une plage Classless Inter-Domain Routing (CIDR), par exemple
192.0.2.1/24
.Une adresse IP valide au format standard IPv4 avec des zéros non significatifs, par exemple
192.000.002.001
(et non pas192.0.2.1
). La fonction accepte jusqu’à trois chiffres pour chaque partie de l’adresse IP.
Cet argument doit être une chaîne littérale ; les noms de colonnes ne sont pas pris en charge. Spécifiez une paire de guillemets simples autour de la chaîne.
Vous ne pouvez pas spécifier plus d’une adresse IP. Vous ne pouvez pas spécifier une adresse IPv6 ou une adresse IPv4 partielle.
Renvoie¶
Renvoie un BOOLEAN.
Renvoie TRUE si une adresse IP valide est spécifiée dans
search_string
et une adresse IP correspondante se trouve danssearch_data
.Renvoie TRUE si une adresse IP valide avec une plage CIDR la plage est spécifiée dans
search_string
et une adresse IP dans la plage spécifiée est trouvée danssearch_data
.Renvoie TRUE si
search_string
est vide et qu’aucune adresse IP valide ne se trouve danssearch_data
.Renvoie NULL si l’un de ces arguments est NULL.
Sinon, renvoie FALSE.
Notes sur l’utilisation¶
La fonction SEARCH_IP fonctionne uniquement sur les données VARCHAR, VARIANT, ARRAY et OBJECT. La fonction renvoie une erreur si l’argument
search_data
ne contient pas de données de ces types de données. Lorsque l’argumentsearch_data
inclut des données des types de données pris en charge et des types de données non pris en charge, la fonction recherche les données des types de données pris en charge et ignore silencieusement les données des types de données non pris en charge. Pour des exemples, voir Exemples de cas d’erreur prévus.La fonction SEARCH_IP fonctionne uniquement sur les données VARCHAR, VARIANT, ARRAY et OBJECT. La fonction renvoie une erreur si vous essayez de rechercher d’autres types de données. Pour des exemples, voir Exemples de cas d’erreur prévus.
Vous pouvez ajouter une optimisation FULL_TEXT de la recherche sur les colonnes qui sont la cible d’appels de fonction SEARCH_IP à l’aide d’une commande ALTER TABLE qui spécifie ENTITY_ANALYZER. Par exemple :
ALTER TABLE ipt ADD SEARCH OPTIMIZATION ON FULL_TEXT( ip1, ANALYZER => 'ENTITY_ANALYZER');
Pour plus d’informations, voir activer l’optimisation de la recherche FULL_TEXT.
Exemples¶
Ces exemples montrent comment utiliser la fonction SEARCH_IP pour interroger les colonnes VARCHAR et VARIANT.
Rechercher une adresse IP correspondante dans les colonnes VARCHAR¶
Créez une table nommée ipt
et insérez deux lignes :
CREATE OR REPLACE TABLE ipt(id INT, ip1 VARCHAR(20), ip2 VARCHAR(20));
INSERT INTO ipt VALUES(1, '192.0.2.146', '203.0.113.5');
INSERT INTO ipt VALUES(2, '192.0.2.111', '192.000.002.146');
Exécutez les requêtes de recherche suivantes. La première requête utilise la fonction SEARCH_IP dans la liste SELECT et recherche les deux colonnes VARCHAR dans la table :
SELECT ip1,
ip2,
SEARCH_IP((ip1, ip2), '192.0.2.146')
FROM ipt
ORDER BY ip1;
+-------------+-----------------+--------------------------------------+
| IP1 | IP2 | SEARCH_IP((IP1, IP2), '192.0.2.146') |
|-------------+-----------------+--------------------------------------|
| 192.0.2.111 | 192.000.002.146 | True |
| 192.0.2.146 | 203.0.113.5 | True |
+-------------+-----------------+--------------------------------------+
Notez que search_data
192.000.002.146
est une correspondance pour search_string
192.0.2.146
même si 192.000.002.146
a des zéros non significatifs.
Cette requête montre une search_string
avec une plage CIDR :
SELECT ip1,
ip2,
SEARCH_IP((ip1, ip2), '192.0.2.1/20')
FROM ipt
ORDER BY ip1;
+-------------+-----------------+---------------------------------------+
| IP1 | IP2 | SEARCH_IP((IP1, IP2), '192.0.2.1/20') |
|-------------+-----------------+---------------------------------------|
| 192.0.2.111 | 192.000.002.146 | True |
| 192.0.2.146 | 203.0.113.5 | True |
+-------------+-----------------+---------------------------------------+
Cette requête montre une search_string
avec des zéros non significatifs qui renvoie True
pour les adresses IP qui omettent les zéros non significatifs :
SELECT ip1,
ip2,
SEARCH_IP((ip1, ip2), '203.000.113.005')
FROM ipt
ORDER BY ip1;
+-------------+-----------------+------------------------------------------+
| IP1 | IP2 | SEARCH_IP((IP1, IP2), '203.000.113.005') |
|-------------+-----------------+------------------------------------------|
| 192.0.2.111 | 192.000.002.146 | False |
| 192.0.2.146 | 203.0.113.5 | True |
+-------------+-----------------+------------------------------------------+
Cette requête utilise la fonction dans la clause WHERE et recherche la colonne ip2
seulement.
SELECT ip1,
ip2
FROM ipt
WHERE SEARCH_IP(ip2, '203.0.113.5')
ORDER BY ip1;
+-------------+-------------+
| IP1 | IP2 |
|-------------+-------------|
| 192.0.2.146 | 203.0.113.5 |
+-------------+-------------+
Lorsque la fonction est utilisée dans la clause WHERE et il n’y a pas de correspondance, aucune valeur n’est renvoyée.
SELECT ip1,
ip2
FROM ipt
WHERE SEARCH_IP(ip2, '203.0.113.1')
ORDER BY ip1;
+-----+-----+
| IP1 | IP2 |
|-----+-----|
+-----+-----+
Vous pouvez utiliser le caractère *
(ou table.*
) comme premier argument de la fonction SEARCH, comme illustré dans cet exemple. La recherche s’effectue sur toutes les colonnes éligibles de la table que vous sélectionnez.
SELECT ip1,
ip2
FROM ipt
WHERE SEARCH_IP((*), '203.0.113.5')
ORDER BY ip1;
+-------------+-------------+
| IP1 | IP2 |
|-------------+-------------|
| 192.0.2.146 | 203.0.113.5 |
+-------------+-------------+
Vous pouvez également utiliser les mots-clés ILIKE et EXCLUDE pour le filtrage. Pour plus d’informations sur ces mots-clés, voir SELECT.
Cette recherche utilise le mot-clé ILIKE pour rechercher uniquement dans les colonnes commençant par la chaîne ip
.
SELECT ip1,
ip2
FROM ipt
WHERE SEARCH_IP(* ILIKE 'ip%', '192.0.2.111')
ORDER BY ip1;
+-------------+-----------------+
| IP1 | IP2 |
|-------------+-----------------|
| 192.0.2.111 | 192.000.002.146 |
+-------------+-----------------+
Pour activer l’optimisation de la recherche FULL_TEXT pour les colonnes dans la table ipt
, exécutez la commande ALTER TABLE suivante :
ALTER TABLE ipt ADD SEARCH OPTIMIZATION ON FULL_TEXT(
ip1,
ip2,
ANALYZER => 'ENTITY_ANALYZER');
Note
Les colonnes que vous spécifiez doivent être les colonnes VARCHAR ou VARIANT. Les colonnes avec d’autres types de données ne sont pas prises en charge.
Rechercher une adresse IP correspondante dans une colonne VARIANT¶
Cet exemple utilise la fonction SEARCH_IP pour rechercher un chemin vers un champ dans une colonne VARIANT. Créez une table nommée iptv
et insérez deux lignes :
CREATE OR REPLACE TABLE iptv(ip1 VARIANT);
INSERT INTO iptv(ip1)
SELECT PARSE_JSON(' { "ipv1": "203.0.113.5", "ipv2": "203.0.113.5" } ');
INSERT INTO iptv(ip1)
SELECT PARSE_JSON(' { "ipv1": "192.0.2.146", "ipv2": "203.0.113.5" } ');
Exécutez les requêtes de recherche suivantes. La première requête recherche le champ ipv1
seulement. La deuxième recherche ipv1
et ipv2
.
SELECT * FROM iptv
WHERE SEARCH_IP((ip1:"ipv1"), '203.0.113.5');
+--------------------------+
| IP1 |
|--------------------------|
| { |
| "ipv1": "203.0.113.5", |
| "ipv2": "203.0.113.5" |
| } |
+--------------------------+
SELECT * FROM iptv
WHERE SEARCH_IP((ip1:"ipv1",ip1:"ipv2"), '203.0.113.5');
+--------------------------+
| IP1 |
|--------------------------|
| { |
| "ipv1": "203.0.113.5", |
| "ipv2": "203.0.113.5" |
| } |
| { |
| "ipv1": "192.0.2.146", |
| "ipv2": "203.0.113.5" |
| } |
+--------------------------+
Pour activer l’optimisation de la recherche FULL_TEXT pour cette colonne ip1
VARIANT et ses champs, exécutez la commande ALTER TABLE suivante :
ALTER TABLE iptv ADD SEARCH OPTIMIZATION ON FULL_TEXT(
ip1:"ipv1",
ip1:"ipv2",
ANALYZER => 'ENTITY_ANALYZER');
Note
Les colonnes que vous spécifiez doivent être les colonnes VARCHAR ou VARIANT. Les colonnes avec d’autres types de données ne sont pas prises en charge.
Exemples de cas d’erreur prévus¶
Les exemples suivants montrent des requêtes qui renvoient des erreurs de syntaxe attendues.
Cet exemple échoue parce que 5
n’est pas un type de données pris en charge pour l’argument search_string
.
SELECT SEARCH_IP(ip1, 5) FROM ipt;
001045 (22023): SQL compilation error:
argument needs to be a string: '1'
Cet exemple échoue car aucune colonne d’un type de données pris en charge n’est spécifiée pour l’argument search_data
.
SELECT SEARCH_IP(id, '192.0.2.146') FROM ipt;
001173 (22023): SQL compilation error: error line 1 at position 7: Expected non-empty set of columns supporting full-text search.
Cet exemple réussit car il existe une colonne d’un type de données pris en charge spécifié pour l’argument search_data
. La fonction ignore la colonne id
car ce n’est pas un type de données pris en charge
SELECT SEARCH_IP((id, ip1), '192.0.2.146') FROM ipt;
+-------------------------------------+
| SEARCH_IP((ID, IP1), '192.0.2.146') |
|-------------------------------------|
| True |
| False |
+-------------------------------------+