簡體   English   中英

具有多個部分匹配條件的 sql 查詢

[英]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"}

JSON解析

Oracle

查看了 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 屬性的路徑,帶有條件。

我為IDName寫了兩個OR ed 條件,但也許有更好的 JSON 查詢表達式可以用來包含它們。

更多關於json_exists() function 的信息在這里

Postgres

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 中也檢查這個問題。

微軟 SQL 服務器 2017

我還使用 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數組,並從中創建一個類似表格的東西,也可以通過訪問它的列來查詢。

我創建的示例在這里

LIKE文字查詢

您的嘗試很好,但是您放錯了%符號。 它們必須是給定字符串中的第一個和最后一個:

如果您希望 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM