PostgreSQL: use funciones JSON y expresiones regulares para ayudarlo a procesar datos semiestructurados de manera fácil y eficiente


I. Introducción

Postgresql es un sistema de gestión de bases de datos relacionales potente, fácil de usar, estable y confiable que se usa ampliamente en aplicaciones de nivel empresarial de todos los tamaños.
Adopta un modelo de datos orientado a objetos y proporciona una gran escalabilidad y flexibilidad.

  • Admite consultas y operaciones complejas, incluida la búsqueda de texto completo, el procesamiento de datos JSON, el procesamiento de transacciones y otras funciones.
  • Admite funciones avanzadas como análisis de datos, procesamiento de gráficos, análisis de series de tiempo, etc.
  • Al admitir la copia de seguridad y recuperación de datos, la fragmentación de datos, la expansión horizontal y otras funciones, puede ayudar a las empresas a administrar y mantener datos masivos de manera efectiva.
  • Admite lectura y escritura de datos de alta concurrencia y alto rendimiento, puede manejar grandes cantidades de datos y es muy estable y confiable.

Además, Postgresql cuenta con un amplio ecosistema y soporte comunitario y se puede integrar fácilmente con otras herramientas y aplicaciones de código abierto.

Este artículo presenta principalmente el procesamiento de algunas matrices encontradas al desarrollar algunos modelos de datos en los últimos dos días.

环境:postgresql 14.1, windows 11

2. Escenarios de procesamiento de datos JSON

Antes de procesar datos, primero debe tener datos JSON. Primero, presentaremos dos métodos para generar datos de tipo JSON: ::jsony to_json(). Hay algunas diferencias entre los dos:

  • ::json: Los campos a convertir deben tener un formato JSON estricto y deben ser cadenas;
  • to_json(): Los campos a convertir, además de cadenas, también admiten valores numéricos, matrices, etc.

Por ejemplo:
utilícelo ::jsonpara convertir una cadena '["12","ab"]'en un valor de tipo JSON:

select '["12","ab"]'::json ary;

imagen.png
Toma el primer valor:
imagen.png

to_json()Convierta una matriz array['12','ab']en un valor JSON usando :

select to_json(array['12','ab']) ary;

imagen.png
Toma el primer valor.
imagen.png

Después de comprender estos dos métodos, los describiremos en cuatro escenarios a continuación:

2.1 Escenario 1: valor JSON

Tarea 1: extraer el valor correspondiente a '{"a":"1","b":"2"}'la clave en la cadena. Esto es relativamente simple: los métodos de valor relevantes se han introducido básicamente anteriormente, que se utilizan para obtener el valor. El SQL es el siguiente:a
->>

select '{"a":"1","b":"2"}'::json->>'a' as "a值";

imagen.png
Cabe señalar que este método devuelve un tipo de texto, si desea devolver un tipo JSON, utilice el ->siguiente SQL:

select '{"a":"1","b":"2"}'::json-> 'a' as "a值";

imagen.png

Tarea 2: extraer el valor correspondiente a '[{"a":"1","b":"2"}]'la clave en la cadena. Esto tiene una capa más de anidamiento, por lo que necesita obtener una capa más al obtener el valor. El método es el siguiente: Cabe señalar que la primera capa debe usarse para devolver el tipo JSON para que pueda continuar obtener el valor. Ya sea un resultado de matriz o una estructura de par clave-valor, ambos usan y obtienen valores: el primero devuelve el tipo JSON y el segundo devuelve el tipo TEXTO.a


->->->>

select '[{"a":"1","b":"2"}]'::json->0->>'a' as "a-text";
select '[{"a":"1","b":"2"}]'::json->0-> 'a' as "a-json";

imagen.png

2.2 Escenario 2: dividir pares clave-valor

Divida los pares clave-valor de la cadena '{"a":"1","b":"2"}'en un par clave-valor por fila, y la clave y el valor en una columna cada uno.

llave valor
a 1
b 2

Para obtener las claves de tipo JSON de la estructura clave-valor, puede json_object_keys()extraerlas. La estructura de datos devuelta es una clave por fila. Los resultados son los siguientes:

select '{"a":"1","b":"2"}'::json "k_v",json_object_keys('{"a":"1","b":"2"}'::json) AS key;

imagen.png
No existe una función similar para obtener el valor, pero si puede obtener la clave, puede obtener el valor a través de la clave, es decir, obtener el valor columna por columna en las siguientes k_vcolumnas key.
imagen.png
El valor SQL es el siguiente:

select '{"a":"1","b":"2"}'::json ->> json_object_keys('{"a":"1","b":"2"}'::json) AS val;

imagen.png
Finalmente, juntemos los tres y echemos un vistazo:

select '{"a":"1","b":"2"}'::json AS "k_v"
			,json_object_keys('{"a":"1","b":"2"}'::json) AS key
			,'{"a":"1","b":"2"}'::json->> 
   			json_object_keys('{"a":"1","b":"2"}'::json) AS val;

imagen.png

2.3 Escenario 3: cadena dividida

Tarea: Separe los '分数: 5'pares clave-valor de cadena en dos columnas. Tenga en cuenta que puede haber espacios entre ellas.

Esto es diferente de lo anterior. Lo anterior es un par clave-valor y es una estructura de formato JSON estándar. Esta es solo una cadena. La estructura es como un par clave-valor, pero su "clave" y "valor" son no está entre comillas dobles, por lo que no es un valor-clave Formatee los datos.

Por lo tanto, es necesario utilizar el corte para separar los valores y considerar el procesamiento de los espacios antes de cortar.

Puede haber muchos métodos de procesamiento. Por ejemplo, primero use replace('分数: 5',' ','')para eliminar espacios y luego use regexp_split_to_array(<string>, '[::]')para cortar la cadena de acuerdo con los dos puntos. Para evitar mezclar chino e inglés, use dos tipos de dos puntos. Esta función devuelve una matriz y finalmente utilizar para to_json()convertir a tipo JSON.Obtener el valor. También es posible obtener valores directamente de una matriz. Mirando el siguiente ejemplo (tomando el primero como ejemplo),

cabe señalar que el índice del tipo JSON comienza desde 0, mientras que el índice del tipo matriz comienza desde 1.

-- 转化为 JSON 类型取值
SELECT to_json(regexp_split_to_array(replace('分数: 5',' ',''), '[::]'))->>0;
-- 转化为 数组类型取值
SELECT (regexp_split_to_array(replace('分数: 5',' ',''), '[::]'))[1];

imagen.png
El método anterior es reemplazar primero y luego cortar. El uso de expresiones regulares también puede lograr la adquisición de valor en un solo paso. El regexp_split_to_array()valor también se obtiene a través de métodos, pero el método de coincidencia es diferente. '(\W+)'El significado de este patrón de coincidencia es:

  • \W : Coincide con _caracteres que no son letras, números, chinos y
  • +: Coincide con uno o más
  • (): Emparejar por grupo, tratando el contenido entre paréntesis como un todo

Entonces, '(\W+)'el significado es hacer coincidir uno o más caracteres que no sean letras, números, chinos ni _caracteres. Si hay espacios y dos puntos en el medio, se combinarán de inmediato.
Los resultados coincidentes son '(\W+)'los siguientes:

-- 转化为 JSON 类型取值
SELECT to_json(regexp_split_to_array('分数: 5', '(\W+)'))->>0;
-- 转化为 数组类型取值
SELECT (regexp_split_to_array('分数: 5', '(\W+)'))[1];

imagen.png
El último paso es '分数: 5'separar las dos columnas, tomando el segundo método como ejemplo, el SQL final es el siguiente:

-- 转化为 JSON 类型取值
SELECT to_json(regexp_split_to_array('分数: 5', '(\W+)'))->>0 AS key,to_json(regexp_split_to_array('分数: 5', '(\W+)'))->>1 AS value;
-- 转化为 数组类型取值
SELECT (regexp_split_to_array('分数: 5', '(\W+)'))[1] AS key,(regexp_split_to_array('分数: 5', '(\W+)'))[2] AS value;

imagen.png

2.4 Escenario 4: Coincidencia de cadenas en lotes

Tarea: Elimine todos '<h3>标签1</h3>\n<p><strong>等级3:一般</strong></p>'los corchetes angulares <>y los caracteres dentro de los corchetes angulares de la cadena, dejando solo el texto.

Puede utilizar funciones para eliminar caracteres regexp_replace()y admitir expresiones regulares. Para eliminar todos los corchetes angulares y las cadenas dentro de ellos, debe hacer coincidir los corchetes angulares. Hay muchos métodos de coincidencia. Aquí hay dos métodos: '<[^>]+>'y '<.*?>'.

  • <y >representan corchetes angulares izquierdo y derecho respectivamente.
  • [^>]Representa cualquier carácter excepto el corchete angular.
  • +Indica que el carácter anterior puede aparecer una o más veces.
  • .*?Es una coincidencia no codiciosa, es decir, coincide con cada conjunto de corchetes angulares y la cadena dentro de ellos.

Tomando el primero como ejemplo, verifique los resultados coincidentes:

SELECT regexp_replace('<h3>标签1</h3>\n<p><strong>等级3:一般</strong></p>', '<[^>]+>', '');

imagen.png
A juzgar por los resultados, el primero se ha emparejado y eliminado correctamente, lo que indica que la lógica es factible.
Pero el objetivo es hacer coincidir y eliminar todos los corchetes angulares y las cadenas dentro de ellos. Esto requiere el uso de regexp_replace()parámetros opcionales flags. De forma predeterminada, esta función solo coincide con un valor. Puede cambiar el modo de coincidencia 'g'para que coincida con todos los valores.

Varios modos comúnmente utilizados son los siguientes:

  • 'g': Modo de coincidencia global, que busca todas las coincidencias en la cadena completa y las reemplaza. El patrón predeterminado coincide solo con uno.
  • 'i': Patrón de coincidencia que no distingue entre mayúsculas y minúsculas, es decir, se ignoran las mayúsculas y minúsculas al realizar la coincidencia. La coincidencia de patrones predeterminada distingue entre mayúsculas y minúsculas.
  • 'm': Modo multilínea, es decir, buscar coincidencias en texto de varias líneas y reemplazarlas. El modo predeterminado sólo encuentra coincidencias dentro de una sola línea de texto.
  • 's': Modo codicioso, que combina tantos personajes como sea posible. El patrón predeterminado coincide con la menor cantidad de caracteres posible.

Ejemplos de los dos últimos métodos de comparación son los siguientes:

SELECT regexp_replace('<h3>标签1</h3>\n<p><strong>等级3:一般</strong></p>', '<[^>]+>', '', 'g');
SELECT regexp_replace('<h3>标签1</h3>\n<p><strong>等级3:一般</strong></p>', '<.*?>', '', 'g');

imagen.png

3. Resumen

Este artículo se centra en el uso de funciones JSON y expresiones regulares en la base de datos PostgreSQL e introduce varios métodos comunes de procesamiento de datos, desde superficiales hasta profundos, incluidos valores JSON, división de pares clave-valor, división de cadenas y coincidencia de cadenas por lotes.

El tipo de datos JSON de PostgreSQL muestra una gran flexibilidad y admite pares clave-valor y estructuras de matrices anidadas, lo que nos permite almacenar y recuperar fácilmente datos no estructurados. Además, combinado con expresiones regulares, que tienen excelentes capacidades de procesamiento de cadenas, el procesamiento de datos no estructurados se convierte en pan comido.

Debido a la limitación de extensión del artículo, solo se presentan una pequeña parte de las funciones JSON y las expresiones regulares. Si desea obtener más información y comprender puntos de conocimiento más completos, puede consultar la documentación oficial.




Lectura relacionada:

Expresiones regulares (aunque esta es una explicación de las expresiones regulares en Python, los puntos de conocimiento subyacentes de las expresiones regulares son los mismos).

Supongo que te gusta

Origin blog.csdn.net/qq_45476428/article/details/131749333
Recomendado
Clasificación