PostgreSQL: JSON 함수와 정규식을 사용하여 반구조화된 데이터를 쉽고 효율적으로 처리할 수 있습니다.


I. 소개

Postgresql은 모든 규모의 엔터프라이즈급 애플리케이션에서 널리 사용되는 강력하고 사용하기 쉽고 안정적이고 신뢰할 수 있는 관계형 데이터베이스 관리 시스템입니다.
객체지향 데이터 모델을 채택하여 풍부한 확장성과 유연성을 제공합니다.

  • 전체 텍스트 검색, JSON 데이터 처리, 트랜잭션 처리 및 기타 기능을 포함한 복잡한 쿼리 및 작업을 지원합니다.
  • 데이터 분석, 그래픽 처리, 시계열 분석 등의 고급 기능을 지원합니다.
  • 데이터 백업 및 복구, 데이터 샤딩, 수평 확장 및 기타 기능을 지원하여 기업이 대용량 데이터를 효과적으로 관리하고 유지하는 데 도움이 됩니다.
  • 높은 동시성 및 고성능 데이터 읽기 및 쓰기를 지원하고 대용량 데이터를 처리할 수 있으며 매우 안정적이고 신뢰할 수 있습니다.

또한 Postgresql은 광범위한 커뮤니티 지원과 생태계를 갖추고 있으며 다른 오픈 소스 도구 및 애플리케이션과 쉽게 통합될 수 있습니다.

이 기사에서는 지난 이틀 동안 일부 데이터 모델을 개발할 때 직면한 일부 배열의 처리를 주로 소개합니다.

环境:postgresql 14.1, windows 11

2. JSON 데이터 처리 시나리오

데이터를 처리하기 전에 먼저 JSON 데이터가 있어야 하는데, 먼저 JSON 형태의 데이터를 생성하는 두 가지 방법, 즉 ::json와 를 소개하겠습니다 to_json(). 둘 사이에는 몇 가지 차이점이 있습니다.

  • ::json: 변환할 필드는 엄격한 JSON 형식을 가져야 하며 문자열이어야 합니다.
  • to_json(): 변환할 필드는 문자열 외에 숫자값, 배열 등도 지원합니다.

예: 문자열을 JSON 유형 값으로 변환하는 데
사용합니다 .::json'["12","ab"]'

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

이미지.png
첫 번째 값을 가져옵니다.
이미지.png

다음 을 사용하여 to_json()배열을 array['12','ab']JSON 값으로 변환합니다.

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

이미지.png
첫 번째 값을 취하세요.
이미지.png

이 두 가지 방법을 이해한 후 아래 네 가지 시나리오로 설명하겠습니다.

2.1 시나리오 1: JSON 값

작업 1: 문자열 '{"a":"1","b":"2"}'의 키 a에 해당하는 값을 추출합니다.
이는 상대적으로 간단하며, 위에서 기본적으로 관련 값 방법을 소개했는데, 이는 ->>값을 구하는 데 사용됩니다. SQL은 다음과 같습니다.

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

이미지.png
이 메소드는 텍스트 유형을 반환한다는 점에 유의해야 합니다. JSON 유형을 반환하려면 다음 ->SQL을 사용하세요.

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

이미지.png

작업 2: 문자열 '[{"a":"1","b":"2"}]'의 키 a에 해당하는 값을 추출합니다.

여기에는 중첩 레이어가 하나 더 있으므로 값을 가져올 때 레이어를 하나 더 가져와야 합니다. 방법은 다음과 같습니다. 계속할 수 있도록
첫 번째 레이어를 사용하여 JSON 유형을 반환해야 한다는 점에 유의해야 합니다. ->가치를 얻으십시오. 배열 결과든 키-값 쌍 구조든 값을 사용 ->하고 가져오는 방식으로 전자는 JSON 형식을 반환하고 후자는 TEXT 형식을 반환합니다.->>

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

이미지.png

2.2 시나리오 2: 키-값 쌍 분할

문자열 '{"a":"1","b":"2"}'의 키-값 쌍을 행당 하나의 키-값 쌍으로 분할 하고, 키와 값을 각각 하나의 열로 분할합니다.

열쇠
1
2

키-값 구조의 JSON 형태의 키를 얻으려면 json_object_keys()이를 추출하면 됩니다. 반환되는 데이터 구조는 행당 하나의 키입니다. 결과는 다음과 같습니다.

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

이미지.png
값을 구하는 비슷한 기능은 없지만, 키를 구할 수 있으면 키를 통해 값을 구하는 것, 즉 다음 열에서 컬럼별로 값을 구하는 k_v것이다 key.
이미지.png
SQL 값은 다음과 같습니다.

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

이미지.png
마지막으로 세 가지를 종합하여 살펴보겠습니다.

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;

이미지.png

2.3 시나리오 3: 문자열 분할

작업: 문자열 '分数: 5'키-값 쌍을 두 개의 열로 분리합니다. 사이에 공백이 있을 수 있습니다.

위와 다릅니다. 위는 키-값 쌍이며 표준 JSON 형식 구조입니다. 이것은 단순한 문자열입니다. 구조는 키-값 쌍과 같지만 "키"와 "값"은 큰따옴표로 묶이지 않았으므로 키-값이 아닙니다. 데이터 형식을 지정합니다.

따라서 커팅을 이용하여 값을 분리해야 하며, 커팅 전 공백 처리도 고려해야 합니다.

처리 방법은 여러 가지가 있을 수 있는데, 예를 들어 먼저 replace('分数: 5',' ','')공백을 제거한 후 regexp_split_to_array(<string>, '[::]')콜론에 따라 문자열을 자르는 데 사용합니다. 중국어와 영어가 섞이는 것을 피하기 위해 두 종류의 콜론을 사용합니다. 이 함수는 배열을 반환하고 마지막으로 JSON 형식으로 변환 하여 to_json()값을 가져옵니다. 배열에서 직접 값을 얻는 것도 가능합니다. 아래 예(첫 번째 예)를 보면

JSON 유형의 인덱스는 0부터 시작하고, 배열 유형의 인덱스는 1부터 시작한다는 점에 유의해야 합니다.

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

이미지.png
위의 방법은 먼저 교체한 다음 잘라내는 것입니다. 정규식을 사용하면 1단계 값 획득도 가능합니다. 값은 regexp_split_to_array()방법을 통해서도 얻을 수 있지만 일치 방법은 다릅니다. '(\W+)'이 일치 패턴의 의미는 다음과 같습니다.

  • \W : _문자 , 숫자, 중국어, 영문이 아닌 문자와 일치합니다.
  • +: 하나 이상 일치
  • (): 그룹별로 일치하며 괄호 안의 내용을 전체적으로 처리합니다.

그래서 '(\W+)'문자, 숫자, 한자, 문자가 아닌 하나 이상의 문자를 일치시킨다는 의미이며 _, 중간에 공백과 콜론이 있으면 한꺼번에 일치한다는 의미입니다.
매칭 결과는 다음과 같습니다 '(\W+)'.

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

이미지.png
마지막 단계는 '分数: 5'두 컬럼을 분리하는 것이며, 두 번째 방법을 예로 들면 최종 SQL은 다음과 같다.

-- 转化为 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;

이미지.png

2.4 시나리오 4: 일괄 문자열 일치

작업: 문자열에서 모든 '<h3>标签1</h3>\n<p><strong>等级3:一般</strong></p>'꺾쇠 괄호 와 꺾쇠 괄호 안의 문자를 제거하고 텍스트만 남깁니다. 함수를 사용하여 문자를 제거 하고 정규식을 지원할 수 있습니다. 모든 꺾쇠괄호와 그 안의 문자열을 제거하려면 꺾쇠괄호를 일치시켜야 합니다. 일치하는 방법에는 여러 가지가 있습니다. 다음은 두 가지 방법입니다: .<>

regexp_replace()'<[^>]+>''<.*?>'

  • <그리고 >각각 왼쪽과 오른쪽 꺾쇠괄호를 나타냅니다.
  • [^>]오른쪽 꺾쇠괄호를 제외한 모든 문자를 나타냅니다.
  • +앞의 문자가 한 번 이상 나타날 수 있음을 나타냅니다.
  • .*?탐욕스럽지 않은 일치입니다. 즉, 각 꺾쇠 괄호 세트와 그 안의 문자열과 일치합니다.

첫 번째 것을 예로 들어 일치하는 결과를 확인하십시오.

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

이미지.png
결과를 보면 첫 번째 항목이 올바르게 일치하고 제거되어 논리가 실현 가능함을 나타냅니다. 하지만 목표는 모든 꺾쇠 괄호와 그 안의 문자열을 일치시키고 제거하는 것입니다. 이를 위해서는 선택적 매개변수를
사용해야 합니다. 기본적으로 이 함수는 하나의 값만 일치합니다. 모든 값과 일치하도록 일치 모드를 변경할 수 있습니다. 일반적으로 사용되는 몇 가지 모드는 다음과 같습니다.regexp_replace()flags'g'

  • 'g': 전체 문자열에서 일치하는 항목을 모두 찾아 교체하는 전역 일치 모드입니다. 기본 패턴은 하나만 일치합니다.
  • 'i': 대소문자를 구분하지 않는 일치 패턴, 즉 일치 시 대소문자를 무시합니다. 기본 패턴 일치는 대소문자를 구분합니다.
  • 'm': 여러 줄 모드, 즉 여러 줄 텍스트에서 일치하는 항목을 찾아 교체합니다. 기본 모드는 한 줄의 텍스트 내에서만 일치하는 항목을 찾습니다.
  • 's': 최대한 많은 캐릭터를 매칭하는 그리디 모드입니다. 기본 패턴은 가능한 한 적은 수의 문자와 일치합니다.

최종 두 가지 매칭 방법의 예는 다음과 같습니다.

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');

이미지.png

3. 요약

이 기사에서는 PostgreSQL 데이터베이스에서 JSON 함수와 정규식을 사용하는 방법에 중점을 두고 JSON 값, 키-값 쌍 분할, 문자열 분할, 문자열 일괄 일치 등 얕은 것부터 깊은 것까지 몇 가지 일반적인 데이터 처리 방법을 소개합니다.

PostgreSQL의 JSON 데이터 유형은 뛰어난 유연성을 보여주고 키-값 쌍과 중첩 배열 구조를 지원하므로 구조화되지 않은 데이터를 쉽게 저장하고 검색할 수 있습니다. 또한 뛰어난 문자열 처리 기능을 갖춘 정규식과 결합하면 비정형 데이터 처리가 매우 쉬워집니다.

글의 길이 제한으로 인해 JSON 함수와 정규식의 일부만 소개합니다. 더 많은 정보를 얻고 더 포괄적인 지식 포인트를 이해하고 싶다면 공식 문서를 확인하세요.




관련 읽기:

정규식 (파이썬의 정규식에 대한 설명이지만 정규식에 대한 기본 지식 포인트는 동일합니다.)

추천

출처blog.csdn.net/qq_45476428/article/details/131749333