?常見SQL函數使用
(注意:不同的數據庫類型使用的語法不同)
以下是MySQL和PostgreSQL在實現替換、抽取、拼接、分列四個常見字符串操作功能時的核心區別總結,按功能分類對比:
1. 替換(Replace)
功能描述 | MySQL | PostgreSQL | 關鍵區別 |
---|---|---|---|
簡單替換 | REPLACE(str, old_str, new_str) | REPLACE(str, old_str, new_str) | 語法相同 |
正則替換 | REGEXP_REPLACE(str, pattern, repl) | REGEXP_REPLACE(str, pattern, repl) | PostgreSQL支持更強大的正則引擎 |
示例 | SELECT REPLACE('abc', 'a', 'X'); ?→?Xbc | SELECT REGEXP_REPLACE('a1b2', '\d', 'X'); ?→?aXbX | PostgreSQL正則語法更靈活 |
2. 抽取(Extract)
功能描述 | MySQL | PostgreSQL | 關鍵區別 |
---|---|---|---|
子串截取 | SUBSTRING(str, start, length) SUBSTR(str, start, length) | SUBSTRING(str FROM start FOR length) | PostgreSQL語法更接近SQL標準 |
正則抽取 | REGEXP_SUBSTR(str, pattern) | SUBSTRING(str FROM pattern) | PostgreSQL直接集成正則到SUBSTRING |
示例 | SELECT SUBSTRING('Hello', 2, 3); ?→?ell | SELECT SUBSTRING('a1b2' FROM '\d+'); ?→?1 | PostgreSQL支持正則抽取更簡潔 |
3. 拼接(Concatenation)
功能描述 | MySQL | PostgreSQL | 關鍵區別 |
---|---|---|---|
多字符串拼接 | CONCAT(str1, str2, ...) 自動忽略NULL | CONCAT(str1, str2, ...) NULL參與返回NULL 或用 || 操作符 | NULL處理不同: MySQL忽略NULL,Pg需用 || 或CONCAT_WS |
帶分隔符拼接 | CONCAT_WS(separator, str1, str2) | CONCAT_WS(separator, str1, str2) | 語法相同 |
示例 | SELECT CONCAT('a', NULL, 'b'); ?→?ab | SELECT 'a' || NULL || 'b'; ?→?NULL | PostgreSQL需顯式處理NULL |
4. 分列(Split)
功能描述 | MySQL | PostgreSQL | 關鍵區別 |
---|---|---|---|
按分隔符拆分 | SUBSTRING_INDEX(str, delim, count) | SPLIT_PART(str, delim, index) | 函數名不同,參數邏輯相似 |
拆分為多行 | 需結合JSON_TABLE (MySQL 8.0+) | UNNEST(STRING_TO_ARRAY(str, delim)) | PostgreSQL原生支持數組拆分 |
示例 | SELECT SUBSTRING_INDEX('a,b,c', ',', 2); ?→?a,b | SELECT SPLIT_PART('a,b,c', ',', 2); ?→?b | PostgreSQL索引從1開始 |
關鍵差異總結
-
正則表達式支持:
-
PostgreSQL的正則引擎更強大(如
\m
單詞邊界、\p{Unicode屬性}
等)。 -
MySQL需使用
REGEXP_
前綴函數(如REGEXP_REPLACE
)。
-
-
NULL處理邏輯:
-
MySQL的
CONCAT()
自動忽略NULL,PostgreSQL的CONCAT()
遇NULL返回NULL,需用\|\|
或COALESCE
處理。
-
-
函數命名與語法:
-
分列操作:MySQL用
SUBSTRING_INDEX
,PostgreSQL用SPLIT_PART
。 -
正則抽取:PostgreSQL直接擴展
SUBSTRING
,MySQL需REGEXP_SUBSTR
。
-
-
數據類型擴展:
-
PostgreSQL原生支持數組類型(
STRING_TO_ARRAY
)和JSON拆分(json_array_elements
),MySQL需依賴JSON函數。
-
使用建議
-
簡單操作:優先使用標準SQL函數(如
REPLACE
、SUBSTRING
)。 -
復雜正則:PostgreSQL更適合(如多模式匹配)。
-
分列需求:PostgreSQL的
SPLIT_PART
和數組操作更直觀。 -
版本注意:MySQL 8.0+才支持完整正則函數(如
REGEXP_REPLACE
)。
所以在使用時需要根據不同的去調整sql代碼(建議去相應的官網查詢)?
字段類型轉換
?
這里補一個python中的常見函數類型轉換
常用轉換函數總結
目標類型 | 轉換函數 | 示例 |
---|---|---|
int | int() | int("123") → 123 |
float | float() | float("3.14") → 3.14 |
str | str() | str(100) → "100" |
bool | bool() | bool(0) → False |
list | list() | list((1,2)) → [1,2] |
tuple | tuple() | tuple([1,2]) → (1,2) |
dict | dict() | dict([('a',1)]) → {'a':1} |
?
例題:
?case where使用樣例:
case where的不同順序會有不同結果