2013-04-14 130 views
1

我需要使用SQL匹配下面提到的模式。使用SQL匹配模式

  1. 「*謝謝」
  2. 「*音樂*」
  3. 「我喜歡* MUSIC」
  4. 「我喜歡*音樂和*油畫」

輸入字符串會看像這樣,
「你好,謝謝你」 - >應該匹配「*謝謝你」
「我喜歡音樂非常多」 - >應該匹配「* MUSIC *」

有沒有辦法使用標準的SQL語法來做到這一點。

請幫忙。

謝謝。

+0

星號是拼寫錯誤還是部分數據?爲什麼第二個目標字符串匹配數據「2.」而不是「3.」或「4.」? – APC

+0

另外,「標準SQL」是什麼意思?您真的正在尋找一種既適用於Oracle也適用於MySQL RDBMS的解​​決方案嗎? – APC

+0

是*是數據的一部分。其實他們是regexps。理想的情況是SQL查詢可以在任何dbms上進行小改動。 –

回答

1

甲骨文的MySQL查詢範例:

不區分大小寫:

select * from database where column like '%THANK YOU%'; 

區分大小寫:

select * from database where column LIKE BINARY '%THANK YOU%'; 

不區分大小寫:

select * from database where column REGEXP 'THANK YOU'; 

甲骨文查詢:

select * from database WHERE REGEXP_LIKE(column, 'THANK YOU', 'i') 

您可以在Oracle中使用LIKE,但不區分大小寫設置取決於版本。

區分大小寫:

select * from database WHERE column LIKE 'THANK YOU'; 

有很多關於使得甲骨文的喜歡不區分大小寫的討論。使用reg_exp版本更容易,並且爲不區分大小寫設置i標誌。

更新 原來的問題實際上與我的第一個答案相反,它確實讓我開始討論我正在爲數據挖掘構建的不少應用程序。昨天晚上實際上有這個想法,但是原來的海報在我做之前發佈了它(Fiddle倒下了)。您可以使正則表達式匹配MySQL中REGEXP函數的兩端。因此,如果您將一系列表達式存儲到數據庫中,那麼您實際上可以將表達式列表與一個條目表或一個字符串進行比較。

我已經添加了一個SQL小提琴這裏:http://sqlfiddle.com/#!8/701a0/2

注意,在原來的例子,在數據庫中的「正則表達式」的價值觀開始時只有一個星號。在正則表達式中,實際的字符串必須是。*可能是任何字符。

我已經添加了幾個例子來匹配諸如網站,美國免費電話號碼和Gmail帳戶之類的東西。

INSERT INTO `myRegex` VALUES (1,'.* THANK YOU$'),(2,'MUSIC'),(3,'I LIKE .* MUSIC'),(4,'I LIKE .* MUSIC AND .* PAINTING'),(5,'^[0-9]?[ .-]?(800|866)'),(6,'\\.com$'),(7,'\\.net$'),(8,'\\.(gmail|googlemail)\\.'),(9,'THANK YOU'); 

輸出

select * from myRegex where 'HI THANK YOU' REGEXP reg_expr; 

enter image description here

select * from myRegex where 'THANK YOU MUCH' REGEXP reg_expr; 

enter image description here

+0

你弄錯了。 – APC

+0

Oracle也支持直LIKE運算符 – APC

+0

感謝您的快速回復,但我真正想要的是另一種方式。你好,謝謝你應該是輸入和結果應該是「*謝謝你」。 –

1

我發現了一個辦法做到這一點使用MySQL,

小號選擇*從知識哪裏'你好,謝謝'REGEXP pattern_col;

pattern_col保存正則表達式。

+0

只是自己測試。不得不轉入。 –