얼마 전에 큰 따옴표로 둘러싸인 숫자 값을 표준 숫자 값으로 변환하기 위해 jsonb 필드가있는 postgresql 데이터베이스에 대한 도움이 필요했으며이 솔루션은 매우 잘 작동했습니다. PostgreSQL에서 선택적인 방식으로 json 필드에서 큰 따옴표 제거
예를 들어 다음 두 행으로 구성된 "test_json"이라는 필드가 있습니다.
{"test_name": "Full", "parameter1": "4.219", "parameter2": 4.4137}
{"test_name": "Full", "parameter1": "3.758", "parameter2": 4.159}
그리고 문제는 수정 후 다음 두 줄이 있다는 것입니다.
{"test_name": "Full", "parameter1": 4.219, "parameter2": 4.4137}
{"test_name": "Full", "parameter1": 3.758, "parameter2": 4.159}
그래서 제안 된 솔루션은 정말 훌륭합니다 ...
그러나 이제 데이터베이스에 숫자 대신 임의의 문자가 제공되는 경우가 있습니다.이 경우이 변환이 작동하지 않습니다. 잘못된 데이터의 예 :
{"test_name": "Full", "parameter1": "4.219", "parameter2": 4.4137}
{"test_name": "Full", "parameter1": "}", "parameter2": 4.159}
또는
{"test_name": "Full", "parameter1": "u", "parameter2": 4.4137}
{"test_name": "Full", "parameter1": "3.758", "parameter2": 4.159}
하지만 거의 같은 캐릭터가 아니기 때문에 자동으로 찾아서 교체하는 데 어려움을 겪습니다.
누구든지 필드 "parameter1"의 값이 숫자로 변환 될 수 있는지 테스트 할 json 필드의 postgresql 함수에 대한 아이디어가 있습니까? 그렇지 않은 경우이 필드 내에서 누락 된 값으로 대체합니까? 예를 들어 "parameter1"에 대한 이전 첫 번째 줄을 사용한 최종 수정 후 : "u"
{"test_name": "Full,"parameter2": 4.4137}
{"test_name": "Full", "parameter1": 3.758, "parameter2": 4.159}
감사합니다 !!
JSON 요소를 분해하고 모든 숫자와 유사한 텍스트를 필터링하고 결과 요소를 재구성합니다.
SELECT
id,
jsonb_object_agg(key, value::numeric) -- 3
|| jsonb_build_object('test_name', test_json -> 'test_name') as test_json -- 4
FROM
t_test,
jsonb_each_text(test_json) as objects -- 1
WHERE value ~ '^[0-9\.]+$' -- 2
GROUP BY id, test_json
UPDATE
문 :
UPDATE t_test t
SET test_json = s.test_json
FROM (
-- <query above>
) s
WHERE t.id = s.id;
편집 : 두 번째 버전 regexp_replace()
:
SELECT
regexp_replace(
test_json::text,
'"((parameter1|parameter2)": "(?:(?![0-9\.]+).)+?)"', '', 'g'
)
FROM
t_test
이것은이 답변의 "negative lookbehind"솔루션을 사용합니다 : https://stackoverflow.com/a/977294/3984221
"
이전 접근 방식으로 캐릭터를 제거하십시오 .이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다