2013-10-08 41 views
2

這裏的工作原理是PostgreSQL的查詢:轉換一個PostgreSQL查詢到的東西,對MySQL

SELECT * 
FROM rates 
WHERE prefix = (SELECT max(prefix) 
       FROM rates 
       where '914428215151' ~* ('^'||prefix)); 

~*

什麼是相當於爲MySQL的MySQL胡扯嗎?

+0

where條件是做什麼的? – Mihai

+1

@Mihai:'〜*'是PostgreSQL中的一個正則表達式運算符:http://www.postgresql.org/docs/current/interactive/functions-matching.html#FUNCTIONS-POSIX-REGEXP –

回答

4

MySQL使用RLIKEREGEXP作爲正則表達式比較運算符。

http://dev.mysql.com/doc/refman/5.6/en/regexp.html#operator_regexp

PostgreSQL的~*運營商是不區分大小寫的,所以是MySQL的:

REGEXP不區分大小寫,與二進制字符串使用時除外。

另一個區別是使用||作爲字符串連接運算符。你可以使MySQL使用該運營商以同樣的方式,如果你SET SQL_MODE=PIPES_AS_CONCAT,但默認情況下它是一個邏輯「或」操作符,所以你應該使用CONCAT()功能:

例子:

SELECT * FROM rates WHERE prefix = (
    SELECT MAX(prefix) FROM rates 
    WHERE '914428215151' REGEXP CONCAT('^', prefix)); 

請回復您的評論:

請勿使用||作爲字符串連接。使用CONCAT()函數。

如果您使用||,它是一個邏輯「或」。 ('^' OR prefix)的結果是true,它由MySQL中的數字1表示。正則表達式比較'914428215151' REGEXP '1'顯然與任何值匹配,所以它返回表中的MAX()值。

+0

非常好,可以工作。然而,我確實有一個我不明白的小問題。這個查詢:SELECT * FROM rates WHERE prefix =(SELECT max(prefix)FROM rates where'914428215151'REGEXP('^'|| prefix));從99899的查詢列返回一個匹配,但是我看到91442存在,所以它絕對不是最接近的匹配。我錯過了什麼? – Arringar1

0

對where子句使用簡單的LIKE。

SELECT max(prefix) FROM rates where prefix LIKE '914428215151%' 
+0

前綴'91442'與OP的查詢匹配,但不是由您的查詢匹配的。 –

+0

好點,謝謝。 – Ben