我的數據庫有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 - >因爲「「不是」和‘坐’匹配(即至少有一個匹配存在)
我的數據庫有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 - >因爲「「不是」和‘坐’匹配(即至少有一個匹配存在)
我認爲你可以做到這一點是:
select t.*
from table t
where col1 rlike replace(col2, ' ', '|');
這會將col2
轉換爲正則表達式。所以,請注意,這個答案對col2
的內容非常敏感。如果它包含正則表達式特殊字符,那麼這可能不起作用。
謝謝。我只是嘗試過這一點,它似乎在大多數情況下都能正常工作,但我發現它錯過了一些例如col1包含「我的新建築公司」而col2包含「UP BOTTLING COMPANY」的地方。我可以看到這一定是由於字符之間的空格數量不一致造成的,所以替換不能很好地工作。由於trim/ltrim/rtrim不起作用,是否有簡單優雅的解決方案? – user1729972
這個答案出現在低質量的審查隊列中,可能是因爲你沒有解釋代碼。如果你解釋它(在你的答案中),你更有可能得到更多的讚揚 - 而提問者更可能學到一些東西! –
你是什麼意思的「火柴」?
這SELECT
會發現行,其中col1
包含的話is
或not
或sat
至少一個:
SELECT rec_num
FROM tbl
WHERE col1 REGEXP '[[:<:]](is|not|sat)[[:>:]]';
這是說的那些話至少一種都存在col1
和col2
:
SELECT rec_num
FROM tbl
WHERE col1 REGEXP '[[:<:]](is|not|sat)[[:>:]]'
AND col2 REGEXP '[[:<:]](is|not|sat)[[:>:]]';
變化AND
到OR
詢問是否存在其中一個或(或兩者)列。
如果您需要相同字(是/不/週六)來匹配都col1
和col2
,是比較複雜的:
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,...)可以更好地完成這樣的任務。
不,這應該適用於任何單詞。是,不是,只是爲了說明。 – user1729972
'單詞'從哪裏來?是否有應用程序代碼生成此查詢?你是否手動編寫查詢?你需要測試3個字嗎? –
我只是試圖選擇表中的所有記錄,其中col1(文本類型)列中至少有一個詞也出現在col2列(也是文本類型)中。所以這個詞可以是任何東西,因爲表格的內容不能預先確定。 – user1729972
Tablescans,啓動您的引擎! – Drew
只有2列?什麼是rec#,某種id? – M0rtiis
這只是爲了說明。查詢將是SELECT * FROM thetable WHERE; (這是我堅持的正則表達式) –
user1729972