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

