這裏的工作原理是PostgreSQL的查詢:轉換一個PostgreSQL查詢到的東西,對MySQL
SELECT *
FROM rates
WHERE prefix = (SELECT max(prefix)
FROM rates
where '914428215151' ~* ('^'||prefix));
上~*
什麼是相當於爲MySQL的MySQL胡扯嗎?
這裏的工作原理是PostgreSQL的查詢:轉換一個PostgreSQL查詢到的東西,對MySQL
SELECT *
FROM rates
WHERE prefix = (SELECT max(prefix)
FROM rates
where '914428215151' ~* ('^'||prefix));
上~*
什麼是相當於爲MySQL的MySQL胡扯嗎?
MySQL使用RLIKE
或REGEXP
作爲正則表達式比較運算符。
見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()值。
非常好,可以工作。然而,我確實有一個我不明白的小問題。這個查詢:SELECT * FROM rates WHERE prefix =(SELECT max(prefix)FROM rates where'914428215151'REGEXP('^'|| prefix));從99899的查詢列返回一個匹配,但是我看到91442存在,所以它絕對不是最接近的匹配。我錯過了什麼? – Arringar1
對where子句使用簡單的LIKE。
SELECT max(prefix) FROM rates where prefix LIKE '914428215151%'
前綴'91442'與OP的查詢匹配,但不是由您的查詢匹配的。 –
好點,謝謝。 – Ben
where條件是做什麼的? – Mihai
@Mihai:'〜*'是PostgreSQL中的一個正則表達式運算符:http://www.postgresql.org/docs/current/interactive/functions-matching.html#FUNCTIONS-POSIX-REGEXP –