我想使用 Oracle SQL 查詢從以下給定的資料結構中僅提取城市值。
例如:{"firstName":"Curtis","lastName":"C Fugatt","street1":"4146 Audiss Rd.","street2":null,"city":"Milton"}
PS:由于這不是 JSON 資料結構,json_value 不起作用,其他執行緒正在建議 Python 中的解決方案。我只想使用 SQL。
uj5u.com熱心網友回復:
使用您發布的示例資料,一個選項可能是:
SQL> with test (col) as
2 (select '{"firstName":"Curtis","street2":null,"city":"Milton"}' from dual union all
3 select '"lastName":"C Fugatt","street1":"4146 Audiss Rd.","city":"Los Angeles"}' from dual
4 )
5 select regexp_replace(substr(col, instr(col, 'city') 7), '[^[:alnum:] ]', '') result
6 from test;
RESULT
--------------------------------------------------------------------------------
Milton
Los Angeles
SQL>
它有什么作用?
substr找到字串的第一個位置city并向其添加 7(以跳過city自身、雙引號和冒號) - 結果 - 將所有內容回傳到字串的末尾- 這意味著城市必須是字串中的最后一個資訊
regexp_replace洗掉除字母數字和空格以外的任何內容- 剩下的是城市名稱(即最終結果)
uj5u.com熱心網友回復:
如果您的值類似于 JSON(但不完全,因此您無法使用 JSON 函式對其進行決議),那么您可以使用以下方法決議類似 JSON 的鍵值對:
SELECT REGEXP_SUBSTR(
value,
'[,{]\s*"city"\s*:\s*"((\\[\/"bfnrt]|\\u[0-9a-fA-Z]{4}|[^\])*)"',
1,
1,
NULL,
1
) AS city
FROM table_name
其中,對于樣本資料:
CREATE TABLE table_name (value) AS
SELECT '{"firstName":"Curtis","lastName":"C Fugatt","street1":"4146 Audiss Rd.","street2":null,"city":"Milton"}' FROM DUAL UNION ALL
SELECT '{
"not_this_one":
"city",
"big_city":
"there",
"little_city":
"somewhere",
"city":
"here"
}' FROM DUAL;
注意:在第二個例子中,你不能天真地尋找cityor"city"因為它會匹配一個值而不是一個鍵。
輸出:
城市 彌爾頓 這里
但是,如果它是 JSON 資料(您的示例是),那么您可以(并且應該)使用 JSON 函式來決議它:
SELECT JSON_VALUE(value, '$.city') AS city
FROM table_name;
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422035.html
標籤:
