Oracle-12c

選擇不包含子字元串/欄位的字元串

  • December 12, 2019

TableA.contentis varchar2(4000),它是從包含網站標記和文本的 CLOB 值填充的,實際上是段落。 TableB.keyword包含一個我想在TableA.content.

我想做這樣的事情,但是不太對。我錯過了什麼?

select tableA.content from TableA
where (select distinct(TableB.keyword) from TableB) not in TableA.content;

因此,我希望其中的所有行都TableA沒有TableB.keyword.

我正在檢查,MATCH或者CONTAINS但我無法正確使用它們。

我相信這個問題可以總結如下:

TableA如果在 中不存在行,則從中選擇一行,TableBTableB.keyword是 的子字元串TableA.content

可以公平地說,前面的答案實現了大致相同的邏輯。同時,在我看來,它以一種不那麼直接的方式這樣做。下面的查詢更直接地匹配建議的邏輯,並且可以說更容易理解:

SELECT
 content
FROM
 TablA
WHERE
 NOT EXISTS
 (
   SELECT
     *
   FROM
     TableB
   WHERE
     TableA.content LIKE '%' || TableB.keyword || '%'
 )
;

您的子查詢可能會返回幾行,但預計只會返回一個並且會出錯。此外,insql 運算符旨在處理集合而不是字元串。

如果您tableA有 ID,則可以嘗試以下查詢:

select tableA.content
from TableA
where ID not in (
 select distinct a.ID
 from TableA a
 join TableB b on (a.content like ('%'||b.keyword||'%'))
 -- for case insensitive matching use instead:
 -- join TableB b on (lower(a.content) like ('%'||lower(b.keyword)||'%')) 
 );

引用自:https://dba.stackexchange.com/questions/136134