2015-09-05 66 views
0

我的數據庫有2列包含文本。當它說的3條記錄如下:MySQL正則表達式返回2列之間至少有一個詞匹配的所有記錄

rec# col1    col2 
1  my name is  fred is 
2  john    mike 
3  today not sat not it sat 

我將不勝感激幫助構建一個正則表達式將返回備案號:

1 - >,因爲「是」匹配

3 - >因爲「「不是」和‘坐’匹配(即至少有一個匹配存在)

+0

Tablescans,啓動您的引擎! – Drew

+0

只有2列?什麼是rec#,某種id? – M0rtiis

+0

這只是爲了說明。查詢將是SELECT * FROM thetable WHERE ; (這是我堅持的正則表達式) – user1729972

回答

1

我認爲你可以做到這一點是:

select t.* 
from table t 
where col1 rlike replace(col2, ' ', '|'); 

這會將col2轉換爲正則表達式。所以,請注意,這個答案對col2的內容非常敏感。如果它包含正則表達式特殊字符,那麼這可能不起作用。

+0

謝謝。我只是嘗試過這一點,它似乎在大多數情況下都能正常工作,但我發現它錯過了一些例如col1包含「我的新建築公司」而col2包含「UP BOTTLING COMPANY」的地方。我可以看到這一定是由於字符之間的空格數量不一致造成的,所以替換不能很好地工作。由於trim/ltrim/rtrim不起作用,是否有簡單優雅的解決方案? – user1729972

+0

這個答案出現在低質量的審查隊列中,可能是因爲你沒有解釋代碼。如果你解釋它(在你的答案中),你更有可能得到更多的讚揚 - 而提問者更可能學到一些東西! –

0

你是什麼意思的「火柴」?

SELECT會發現行,其中col1包含的話isnotsat至少一個:

SELECT rec_num 
    FROM tbl 
    WHERE col1 REGEXP '[[:<:]](is|not|sat)[[:>:]]'; 

這是說的那些話至少一種都存在col1col2

SELECT rec_num 
    FROM tbl 
    WHERE col1 REGEXP '[[:<:]](is|not|sat)[[:>:]]' 
     AND col2 REGEXP '[[:<:]](is|not|sat)[[:>:]]'; 

變化ANDOR詢問是否存在其中一個(或兩者)列。

如果您需要相同字(是/不/週六)來匹配col1col2,是比較複雜的:

SELECT rec_num 
    FROM tbl 
    WHERE (col1 REGEXP '[[:<:]]is[[:>:]]' 
     AND col2 REGEXP '[[:<:]]is[[:>:]]') 
     OR (col1 REGEXP '[[:<:]]not[[:>:]]' 
     AND col2 REGEXP '[[:<:]]not[[:>:]]') 
     OR (col1 REGEXP '[[:<:]]sat[[:>:]]' 
     AND col2 REGEXP '[[:<:]]sat[[:>:]]'); 

如果你的意思是別的東西,實踐要求精確的問題。

附錄

這不是在SQL實用發現哪個詞(如果有的話)是常見的兩個文本字段之間。用應用程序編程語言(PHP,Java,Perl,...)可以更好地完成這樣的任務。

+0

不,這應該適用於任何單詞。是,不是,只是爲了說明。 – user1729972

+0

'單詞'從哪裏來?是否有應用程序代碼生成此查詢?你是否手動編寫查詢?你需要測試3個字嗎? –

+0

我只是試圖選擇表中的所有記錄,其中col1(文本類型)列中至少有一個詞也出現在col2列(也是文本類型)中。所以這個詞可以是任何東西,因爲表格的內容不能預先確定。 – user1729972

相關問題