我在一列中有一個 JSON 字串,例如 [{'id': 2746, 'name': "HaZore'a", 'lat': Decimal('32.644516'), 'lon': Decimal('35.11918') }] 我的 RS 表。我的要求是從名稱值(HaZore'a)中洗掉這個單引號,然后用雙引號替換所有單引號,并洗掉方括號,因為 JSON 只識別雙引號。我試著這樣做
replace(replace(left(right((replace(replace(city, '\'', '"'), 'None', '"None"')),
len((replace(replace(city, '\'', '"'), 'None', '"None"'))) - 1),
len((replace(replace(city, '\'', '"'), 'None', '"None"'))) - 2), '\'',
'"'), 'Decimal(', ''), ')', '')
但是,它在名稱值中留下了雙引號,例如 {"id": 2746, "name": "HaZore"a", "lat": "32.644516", "lon": "35.11918"}。
我應該如何更新我的上述陳述句以消除列中名稱值中的撇號。我有幾行名稱值帶有撇號。
請幫忙。
謝謝阿金奇亞
uj5u.com熱心網友回復:
我認為您需要切換到 regexp_replace() 以更正確地進行模式匹配。請參閱:https ://docs.aws.amazon.com/redshift/latest/dg/REGEXP_REPLACE.html
由于此文本類似于 json,因此帶有單引號的雙引號文本將僅包含 alpha 字符(除了單引號)。您可以使用它來進行模式匹配。
我得到了一個 postgres 來演示(見評論)。現在 Redshift 和 postgres 以不同的方式轉義文本中的單引號,因此需要進行一些轉換,但我會在幾秒鐘內完成。
資料設定:
create table test as
select '[{''id'': 2746, ''name'': "HaZore''a", ''lat'': Decimal(''32.644516''), ''lon'': Decimal(''35.11918'')}]'''::text
as txt;
SQL查詢:
select replace(regexp_replace(txt, '("[[:alpha:]]*)''([[:alpha:]]*")', '\1-\2'), '''', '"')
from test;
我將撇號改為破折號以使事情更清楚。根據需要隨意更改或消除它。
現在要轉義 Redshift 中的單引號,我相信您需要對它們進行反斜杠。所以查詢變為:
select replace(regexp_replace(txt, '("[[:alpha:]]*)\'([[:alpha:]]*")', '\1-\2'), '\'', '"')
from test;
由于我尚未啟動 Redshift 以在該環境中進行測驗,請原諒任何錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435536.html
