[英]sql query with multiple partial match condition
我有一個表格列,如下所示。 什么是 sql 查詢語句,我可以使用它來擁有多個部分匹配條件?
按 ID 或姓名搜索
如果搜索 abc 然后列出 A1 行,A2 行
如果搜索測試,則列出 A1 行、A2 行、3 行
如果搜索 ghj 然后列出 A2 行
我正在嘗試這個但沒有任何回報:
SELECT * FROM table where colB LIKE '"ID":"%abc%"'
更新文本中的數據
{"ItemId":"123","IDs":[{"ID":"abc","CodingSystem":"cs1"}],"Name":"test itemgh"}
{"ItemId":"123","IDs":[{"ID":"ghj","CodingSystem":"cs1"}],"Name":"test abc"}
{"ItemId":"123","IDs":[{"ID":"defg","CodingSystem":"cs1"}],"Name":"test 111"}
查看了 Oracle 的 JSON 解析功能,我設法運行如下查詢:
select * from table t where json_exists(t.colB, '$.IDs[?(@.ID=="abc")]') or json_exists(t.colB, '$.IDs?(@.name=="abc"')
在同一個 JSON 查詢表達式中:
select * from table t where json_exists(t.colB, '$.IDs[?(@.ID=="abc" || @.name=="abc")]')
function json_exists()
的調用是這個的關鍵。 第一個參數可以是VARCHAR2
,我也嘗試使用包含文本的BLOB
,它可以工作。 第二個參數是需要測試的 json object 屬性的路徑,帶有條件。
我為ID
和Name
寫了兩個OR
ed 條件,但也許有更好的 JSON 查詢表達式可以用來包含它們。
更多關於json_exists()
function 的信息在這里。
Postgres 中有一個 JSON 數據類型,支持在查詢中解析。 因此,如果您的colB
列被聲明為 JSON 您可以執行以下操作:
select * from table where colB->>'Name' LIKE '%abc%';
為了獲得 IDs 數組的數組元素,您應該使用 function json_array_elements()
。
select * from table, json_array_elements(colB->'IDs') e where colB->>'Name' LIKE '%abc%' or e->>'ID' = 'abc';
在這里查看我為您創建的示例。
這是一個在線工具,用於在線測試您的 JSON 查詢。
在 SO 中也檢查這個問題。
我還使用 MS SQL 服務器進行了一些測試,並設法創建了一個在名稱字段中搜索部分匹配的示例。
select * from table where JSON_VALUE(colB,'$.Name') LIKE '%abc%';
最后我到達了一個工作查詢,它與Name
字段部分匹配,與ID
字段完全匹配,如下所示:
select * from table t
CROSS APPLY OPENJSON(colB, '$.IDs') WITH (
ID VARCHAR(10),
CodingSystem VARCHAR(10)
) e
where JSON_VALUE(t.colB,'$.Name') LIKE '%abc%'
or e.ID = 'abc';
問題是我們需要打開IDs
數組,並從中創建一個類似表格的東西,也可以通過訪問它的列來查詢。
我創建的示例在這里。
您的嘗試很好,但是您放錯了%
符號。 它們必須是給定字符串中的第一個和最后一個:
如果您希望 ID 為給定值:
SELECT * FROM table where colB LIKE '%"ID":"abc"%'
如果給定的值可以在任何地方,則不要放置"ID"
部分:
SELECT * FROM table where colB LIKE '%abc%'
如果給定值只能在 ID 或 Name 字段上,則:
SELECT * FROM table where colB LIKE '%"ID":"abc"%' OR colB LIKE '%"Name":"abc"%'
並且因為您提供的字段(例如 ID 和名稱)的硬編碼標識符可以是可變大小寫的:
SELECT * FROM table where lower(colB) LIKE '%"id":"abc"%' OR lower(colB) LIKE '%"name":"abc"%'
假設空格的數量在:
字符和屬性的值或名稱之間沒有變化。
對於部分匹配,您可以在'%"name":"%abc%"%'
之間使用更多%
:
SELECT * FROM table where lower(colB) LIKE '%"id":"abc"%' OR lower(colB) LIKE '%"name":"%abc%"%'
另一種選擇是使用正則表達式進行測試。 考慮檢查這個: Oracle extract json fields using regular expression with oracle regexp_substr
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.