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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
通過navicat連接SQL?Server數(shù)據(jù)庫的詳細步驟
本文介紹如何通過navicat連接SQL?Server數(shù)據(jù)庫,以往總是使SQL?Server客戶端來連接SQL?Server數(shù)據(jù)庫,但是SQL?Server客戶端一般有幾百M的大小,而且安裝繁瑣配置麻煩,如果可以通過Navicat直接連接SQL?Server則會非常輕松方便,需要的朋友可以參考下2023-12-12
SQL Server 作業(yè)同步 (結合備份作業(yè))
昨天發(fā)了篇 SQL Server 作業(yè)備份,今天就加上powershell 把 作業(yè)同步 完善起來,方便需要的朋友2012-06-06
SQLSERVER 的 truncate 和 delete 區(qū)別解析
在面試中我相信有很多朋友會被問到 truncate 和 delete 有什么區(qū)別,接下來通過本文給大家普及下SQLSERVER 的 truncate 和 delete 有區(qū)別,需要的朋友可以參考下2023-02-02
SQL Server查詢數(shù)據(jù)庫中表使用空間信息實現(xiàn)腳本
這篇文章主要介紹了SQL Server查詢數(shù)據(jù)庫中表使用空間信息實現(xiàn)腳本,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-07-07
Linux安裝ODBC連接SQLServer數(shù)據(jù)庫的步驟
這篇文章主要介紹了Linux安裝ODBC連接SQLServer數(shù)據(jù)庫?,本文分步驟給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
win2008 r2 安裝sql server 2005/2008 無法連接服務器解決方法
在與 SQL Server 建立連接時出現(xiàn)與網(wǎng)絡相關的或特定于實例的錯誤。未找到或無法訪問服務器。請驗證實例名稱是否正確并且 SQL Server 已配置為允許遠程連接2015-01-01
SQL?Server新特性SequenceNumber用法介紹
這篇文章介紹了SQL?Server新特性SequenceNumber的用法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-02-02

