SQL數(shù)據(jù)類型轉換CAST詳解
前言
在 SQL 數(shù)據(jù)處理中,數(shù)據(jù)類型轉換是常見需求,尤其在跨系統(tǒng)數(shù)據(jù)交互時。在SQL的世界里,數(shù)據(jù)類型轉換是一個基礎且關鍵的操作,它貫穿于數(shù)據(jù)庫開發(fā)、管理與數(shù)據(jù)分析的各個環(huán)節(jié),深刻理解它們對于編寫高效、穩(wěn)定的SQL代碼至關重要。
一、概述
1.1 CAST 函數(shù)是什么
在實際操作中,我們常常需要在不同數(shù)據(jù)類型之間進行轉換。比如,當我們從用戶處獲取數(shù)據(jù)時,用戶輸入的數(shù)據(jù)可能是字符串類型,但在數(shù)據(jù)庫中存儲時,可能需要轉換為對應的數(shù)值類型或日期類型。又或者在進行數(shù)據(jù)查詢和分析時,為了滿足特定的業(yè)務邏輯和計算需求,也需要對數(shù)據(jù)類型進行轉換。例如,在統(tǒng)計銷售數(shù)據(jù)時,銷售金額可能存儲為字符串格式,但在進行求和或平均值計算時,就需要將其轉換為數(shù)值類型。
在數(shù)據(jù)處理的戰(zhàn)場上,CAST 函數(shù)堪稱是數(shù)據(jù)類型轉換的[瑞士軍刀]。作為 SQL 標準函數(shù),用于將一個數(shù)據(jù)類型的值轉換為另一個類型,它既能解決數(shù)值與字符的“跨界矛盾”,也能化解日期格式的“時空錯亂”。這在處理不同類型的數(shù)據(jù)時非常有用,比如將字符串轉換為數(shù)字,或者將浮點數(shù)轉換為整數(shù)等。
1.2 CAST 函數(shù)的基本語法
CAST 函數(shù)的基本語法是這樣的:
CAST(expression AS data_type)
| 參數(shù) | 簡要說明 |
|---|---|
| expression | 要轉換的原始表達式 |
| AS | 用于分隔兩個參數(shù),在AS之前的是要處理的數(shù)據(jù),在AS之后是要轉換的數(shù)據(jù)類型。 |
| data_type | 要轉換成的數(shù)據(jù)類型。數(shù)據(jù)庫不同,支持的數(shù)據(jù)類型不同,使用時需注意。 |
| 類型 | 簡要說明 | 格式 |
|---|---|---|
| DATE | 將 value 轉化為 DATE 類型 | YYYY-MM-DD |
| DATETIME | 將 value 轉化為 DATETIME 類型 | YYYY-MM-DD HH:MM:SS |
| DECIMAL[(M[,D])] | 將 value 轉化為 DECIMAL 類型。 使用可選的 M 和 D 參數(shù)指定最大位數(shù)(M)和小數(shù)點(D)后的位數(shù) | |
| TIME | 將 value 轉化為 TIME 類型 | HH:MM:SS |
| CHAR | 將 value 轉化為 CHAR 類型 (固定長度的字符串) | |
| NCHAR | 將 value 轉化為 NCHAR | |
| SIGNED | 將 value 轉化為 SIGNED (有符號的 64 位整數(shù)) | |
| UNSIGNED | 將 value 轉化為 UNSIGNED (無符號 64 位整數(shù)) | |
| BINARY | 將 value 轉化為 BINARY (二進制字符串) | |
| DOUBLE | 將 value 轉化為 DOUBLE 類型 | |
| FLOAT | 將 value 轉化為 FLOAT 類型 |
舉個簡單的例子,如果有一個字符串 '2026-01-23',想把它轉成日期類型,就可以這樣寫:
SELECT CAST('2023-01-01' AS DATE)
這在處理原始數(shù)據(jù)不是標準格式時特別有用,比如從文本文件導入數(shù)據(jù)后,需要把某些字段轉換成數(shù)值或者日期類型。它簡單直接,但在使用過程中也有一些細節(jié)需要注意,特別是不同類型之間的轉換規(guī)則。如果轉換失敗(比如把 ABC 轉成整數(shù)),大多數(shù)數(shù)據(jù)庫會報錯,所以使用前最好確認數(shù)據(jù)是可以安全轉換的。
二、CAST 的實戰(zhàn)場景
CAST 函數(shù)在 SQL 中有廣泛的應用場景,主要包括以下幾個方法:
2.1 數(shù)據(jù)類型轉換
CAST 函數(shù)最常見的用法就是進行數(shù)據(jù)類型的轉換,例如,我們有一個字符串類型的字段,但需要將其轉換為數(shù)字類型進行計算,這就可以用 CAST 函數(shù)來實現(xiàn):
# 字符串轉整數(shù)
SELECT CAST('123' AS SIGNED);
# 字符串轉浮點型數(shù)字
SELECT CAST('123.456' AS FLOAT);
2.2 字符串轉換
除了數(shù)據(jù)類型的轉換,CAST 函數(shù)還可以用于字符串的轉換:
# 將當前時間轉換成字符串類型 SELECT CAST(NOW() AS CHAR); # 整數(shù)轉字符串 SELECT CAST(123 AS CHAR); # 浮點數(shù)轉字符串 SELECT CAST(123.456 AS CHAR);
在進行字符串轉換時,需要注意目標數(shù)據(jù)類型的長度限制。如果轉換后的字符串長度超過了目標數(shù)據(jù)類型的長度限制,可能會導致截斷錯誤。在這種情況下,可以使用LEFT函數(shù)來截取指定長度的子字符串。
SELECT LEFT(CAST('He1lo,World' AS CHAR(5)), 5);
使用CAST函數(shù)時需要注意,不同數(shù)據(jù)庫對數(shù)據(jù)類型的寫法略有差異。例如,MySQL中用CHAR或VARCHAR,而SQL Server中常用NVARCHAR。
2.3 日期時間轉換
在 SQL 中,日期的格式有很多種,有時候需要將日期轉換為特定的格式,這時候可以嘗試轉換為 DATE、TIME、DATETIME 類型。CAST 函數(shù)可以用于日期的轉換,以滿足業(yè)務需求。例如我們有一個日期類型的字段,但需要將其轉換為另一種日期格式,這就可以用 CAST 函數(shù)來實現(xiàn):
# 將值轉換為TIME數(shù)據(jù)類型
SELECT CAST(NOW() AS time);
SELECT CAST('2026-01-25' AS time);
SELECT CAST('2026-01-25 10:30:00' AS time);
# 將值轉換為DATE數(shù)據(jù)類型
SELECT CAST(NOW() AS date);
SELECT CAST('2026-01-25' AS date);
SELECT CAST('2026-01-25 10:30:00' AS date);
# 將值轉換為DATETIME數(shù)據(jù)類型
SELECT CAST(NOW() AS datetime);
SELECT CAST('2026-01-25' AS datetime);
SELECT CAST('2026-01-25 10:30:00' AS datetime);
2.4 數(shù)值與字符的“變形記”
-- 字符串轉整數(shù)
SELECT CAST('123' AS INTEGER) AS string_to_int;
-- 字符串轉小數(shù)(指定精度)
SELECT CAST('123.45' AS DECIMAL(5,2)) AS string_to_decimal;
-- 科學計數(shù)法字符串轉浮點
SELECT CAST('1.23E+5' AS FLOAT) AS scientific_to_float;
-- 帶貨幣符號字符串轉數(shù)值(需數(shù)據(jù)庫支持)
SELECT CAST('$123.45' AS DECIMAL(10,2)) AS currency_to_decimal;
在 SQL 中,當需要對存儲為字符串類型的數(shù)值字段進行排序時,直接使用 ORDER BY 會導致字典序排序而非數(shù)值排序。
SELECT CAST(123.456 AS DECIMAL(10, 2));
有時候我們會從日志或者其他系統(tǒng)中拿到類似 '100' 這樣的字符串,但實際想要做加減乘除操作,這時候就需要轉換成數(shù)字類型:
SELECT CAST('100' AS SIGNED)
如果字符串里有非數(shù)字字符,比如 '100元',那就會出錯。所以在轉換之前可以用一些函數(shù)預處理,比如 TRIM() 或者正則表達式過濾掉非數(shù)字部分。
三、避坑指南
3.1 空字符陷阱
不同數(shù)據(jù)庫對 CAST 函數(shù)的處理各有差異,例如 CAST('' AS DATE),MySQL 會直接報錯,PostgreSQL 返回無效日期錯誤,Oracle 則會拋出異常。建議先用 CASE WHEN 過濾空值,或者結合COALESCE(NULLIF(column,''), '默認值')處理。
3.2 精度丟失
將 DECIMAL 轉 INT 會直接截斷小數(shù),需預先用ROUND() 或者 CEILING()處理更安全。
四、總結
CAST 函數(shù)在數(shù)據(jù)處理和轉換中非常有用,尤其是在數(shù)據(jù)導入和報告生成時,可以確保數(shù)據(jù)類型的正確性和一致性。
到此這篇關于SQL數(shù)據(jù)類型轉換CAST詳解的文章就介紹到這了,更多相關SQL 類型轉換CAST內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
大數(shù)據(jù)量分頁存儲過程效率測試附測試代碼與結果
在項目中,我們經(jīng)常遇到或用到分頁,那么在大數(shù)據(jù)量(百萬級以上)下,哪種分頁算法效率最優(yōu)呢?我們不妨用事實說話。2010-07-07
SQLServer 2000 升級到 SQLServer 2008 性能之需要注意的地方之一
今天在 相同環(huán)境測試 2000 和 2008 性能 讓我意外的是 2008 明顯比2000 慢很多,因為不能簡單的升級,sql語句也需要優(yōu)化2012-02-02
sqlserver性能優(yōu)化之內存優(yōu)化詳解
本文介紹了SQL Server內存優(yōu)化的詳細方案,包括核心配置、監(jiān)控手段和高級技術,并提供了腳本示例及配置建議,內容涵蓋了內存上下限設置、啟用AWE、緩沖池擴展、監(jiān)控關鍵內存指標、清理緩存策略、索引優(yōu)化、內存優(yōu)化表(In-Memory OLTP)以及自動化維護與監(jiān)控等2026-03-03
SQL2008的sa賬戶被禁用其他賬戶無法連接的快速解決方法
這篇文章主要介紹了SQL2008的sa賬戶被禁用其他賬戶無法連接的快速解決方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03

