2013-03-18 54 views
1

如何使用CONTAINS子句從表的2列進行搜索。 例如: - 可以說我有一個名爲CONTACT的表。它包含諸如名字,姓氏,用戶名,電子郵件等將Oracle CONTAINS子句用於2列

現在,如果我想用包含搜索字符串,說「ABCD」列USERNAME列條款,我會寫:

SELECT * 
FROM CONTACT 
WHERE (CONTAINS(USERNAME, 'ABCD', 1)> 0); 

它給了我想要的結果。但是如果我必須搜索2列的字符串呢?我試過使用: -

SELECT * 
FROM CONTACT 
WHERE (CONTAINS(USERNAME, 'ABCD', 1)> 0) 
AND (CONTAINS(FIRST_NAME, 'ABCD', 1)> 0); 

但它給了我一個錯誤。請幫我解決一下這個。

PS:按照使用CONTAINS子句的要求創建列索引。

+1

您可以發佈錯誤信息嗎? – JWK 2013-03-18 10:23:27

+0

ORA-29907:在主要調用中發現重複標籤 29907. 00000 - 「在主要調用中發現重複標籤」 *原因:運營商有多個主要調用, 與標籤號碼相同。 *操作:在主調用中使用不同的標籤。 – paras2682 2013-03-18 10:30:48

回答

3

您的標籤不是唯一的,請嘗試:

SELECT * 
FROM CONTACT 
WHERE (CONTAINS(USERNAME, 'ABCD', 1)> 0) 
AND (CONTAINS(FIRST_NAME, 'ABCD', 2)> 0); 
+0

JWK:thanx。它現在工作。但是,你能否詳細說明這背後的邏輯是什麼? – paras2682 2013-03-18 10:39:33

+0

Oracle需要跟蹤分數,並需要一個獨特的標籤才能做到這一點。通過這種方式,您可以使用SQL語句中的其他分數,例如select部分。 – JWK 2013-03-18 10:43:08

+0

但是如果我交換分數,會有什麼區別。或者說我只在USERNAME上搜索並使用2作爲它的分數? – paras2682 2013-03-18 10:48:30

3

其實,如果你使用的是包含第一次以上,那麼你可以跳過標籤:

SELECT * FROM CONTACT WHERE (CONTAINS(USERNAME, 'ABCD')> 0) AND (CONTAINS(FIRST_NAME, 'ABCD')> 0);

它會自動添加標籤。