首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 日期格式化、多表聯結查詢與 CASE WHEN 判斷語句實戰範例

     編輯:關於SqlServer

本文以 MySQL/MariaDB 語法為主 (SQL Server/Oracle 語法於註記說明),展示三大常用 SQL 技巧:日期格式化輸出、多表聯結查詢、CASE WHEN 條件判斷轉換。

1. 日期格式化:DATE_FORMAT

資料表 user 欄位 time (DATETIME) 需輸出 yyyy-MM-dd 格式:

SELECT u.id, u.userId, u.timeType,
       DATE_FORMAT(u.time, '%Y-%m-%d') AS time,
       u.secondId
FROM `user` u;

常用格式代碼:%Y 四位年、%m 雙位月、%d 雙位日、%H 24時、%i 分、%s 秒、%W 週名、%M 月名。

跨資料庫對照:

資料庫函數/語法範例
MySQL/MariaDBDATE_FORMAT(date, format)DATE_FORMAT(NOW(), '%Y-%m-%d')
SQL ServerFORMAT(date, format) / CONVERT(varchar, date, style)FORMAT(GETDATE(), 'yyyy-MM-dd') / CONVERT(varchar, GETDATE(), 23)
OracleTO_CHAR(date, format)TO_CHAR(SYSDATE, 'YYYY-MM-DD')
PostgreSQLTO_CHAR(date, format)TO_CHAR(NOW(), 'YYYY-MM-DD')

2. 多表聯結查詢 (三表 INNER JOIN)

三表結構:

需求:主表 user 聯結 name (顯示 username) 與 second (顯示 secondname)。

SELECT u.id, n.name AS username, u.timeType, u.time, s.name AS secondname
FROM `user` u
INNER JOIN `name` n ON u.userId = n.id
INNER JOIN `second` s ON u.secondId = s.id;

聯結類型速查

類型關鍵字結果
內部聯結INNER JOIN / JOIN兩表皆符合條件的列
左外部聯結LEFT JOIN / LEFT OUTER JOIN左表所有列 + 右表符合列 (無符合則 NULL)
右外部聯結RIGHT JOIN右表所有列 + 左表符合列
完整外部聯結FULL JOIN / FULL OUTER JOIN兩表所有列 (MySQL 不支援,用 UNION 模擬)
交叉聯結CROSS JOIN笛卡兒積 (M×N 列)

3. CASE WHEN 條件判斷轉換

資料表 user 欄位 timeType (INT):2 →「每月第二天」、4 →「每月第四天」。

SELECT u.id, u.userId,
       CASE u.timeType
           WHEN 2 THEN '每月第二天'
           WHEN 4 THEN '每月第四天'
           ELSE '其他'
       END AS timeTypeDesc,
       u.time, u.secondId
FROM `user` u;

CASE 兩種語法形式

  • 簡單 CASE:CASE col WHEN val1 THEN r1 WHEN val2 THEN r2 ELSE r0 END (等值比較)。
  • 搜尋 CASE:CASE WHEN cond1 THEN r1 WHEN cond2 THEN r2 ELSE r0 END (任意布林條件,如範圍、複合條件)。

進階應用:動態欄位別名、排序、群組

-- 動態排序
ORDER BY CASE @sortCol WHEN 'name' THEN name WHEN 'date' THEN date END;

-- 條件群組統計
SELECT CASE WHEN score >= 90 THEN '優'
            WHEN score >= 80 THEN '良'
            WHEN score >= 60 THEN '及格'
            ELSE '不及格' END AS grade,
       COUNT(*) AS cnt
FROM scores
GROUP BY grade;

綜合實戰:單一查詢結合三技巧

SELECT u.id,
       DATE_FORMAT(u.time, '%Y-%m-%d') AS date,
       n.name AS username,
       s.name AS secondname,
       CASE u.timeType
           WHEN 2 THEN '每月第二天'
           WHEN 4 THEN '每月第四天'
           ELSE '未定義'
       END AS schedule
FROM `user` u
INNER JOIN `name` n ON u.userId = n.id
INNER JOIN `second` s ON u.secondId = s.id
WHERE u.time >= '2024-01-01'
ORDER BY u.time DESC;

掌握日期格式化、多表聯結、CASE WHEN 三大核心技巧,即可應對 80% 以上的業務查詢開發需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved