
LEN ( string_expression )LEN関数は、末尾の空白を除外します。
LEN関数は文字列の右側(末尾)にある空白文字をカウントしないのです。-- ========================================
-- SQL1: テストデータの準備
-- ========================================
CREATE TABLE StringTest (
ID INT PRIMARY KEY,
TestString NVARCHAR(50),
Description NVARCHAR(100)
);
INSERT INTO StringTest (ID, TestString, Description) VALUES
(1, 'Hello', '通常の文字列'),
(2, 'Hello ', '右側に5つの半角スペース'),
(3, ' Hello', '左側に5つの半角スペース'),
(4, ' Hello ', '両側に半角スペース'),
(5, 'Hello ', '右側に3つの全角スペース'),
(6, '', '空文字列'),
(7, ' ', '半角スペースのみ5文字');-- ========================================
-- SQL2: LEN関数の挙動確認
-- ========================================
SELECT
ID,
TestString,
'[' + TestString + ']' AS BracketedString,
LEN(TestString) AS LEN_Result,
DATALENGTH(TestString) AS DATALENGTH_Result,
Description
FROM StringTest
ORDER BY ID;| ID | TestString | BracketedString | LEN_Result | DATALENGTH_Result | Description |
|---|---|---|---|---|---|
| 1 | Hello | [Hello] | 5 | 10 | 通常の文字列 |
| 2 | Hello | [Hello ] | 5 | 20 | 右側に5つの半角スペース |
| 3 | Hello | [ Hello] | 10 | 20 | 左側に5つの半角スペース |
| 4 | Hello | [ Hello ] | 7 | 18 | 両側に半角スペース |
| 5 | Hello | [Hello ] | 5 | 16 | 右側に3つの全角スペース |
| 6 | [] | 0 | 0 | 空文字列 | |
| 7 | [ ] | 0 | 10 | 半角スペースのみ5文字 |

LEN関数と混同しやすいのがDATALENGTH関数です。| 関数 | 末尾の空白 | 戻り値の単位 | 用途 |
|---|---|---|---|
| LEN | 除外する | 文字数 | 文字列の実質的な長さを取得 |
| DATALENGTH | カウントする | バイト数 | データの実際のサイズを取得 |
0 を返す10 を返す-- ❌ LENだけでは不十分
IF LEN(@UserInput) = 0
PRINT '空です' -- スペースのみの入力も「空」と判定されてしまう
-- ⭕ より厳密なチェック
IF LEN(LTRIM(RTRIM(@UserInput))) = 0
PRINT '空またはスペースのみです'
-- ⭕ データが実際に存在するかチェック
IF DATALENGTH(@UserInput) = 0
PRINT '完全に空です'実際の文字数 = DATALENGTH(文字列) ÷ 2 -- NVARCHAR型の場合-- ========================================
-- SQL3: LENとDATALENGTHの使い分け
-- ========================================
DECLARE @Text1 NVARCHAR(50) = 'Hello '; -- 右側に5つのスペース
DECLARE @Text2 NVARCHAR(50) = 'こんにちは';
SELECT
'Text1' AS TextName,
@Text1 AS Value,
LEN(@Text1) AS LEN_文字数,
DATALENGTH(@Text1) AS DATALENGTH_バイト数,
DATALENGTH(@Text1) / 2 AS 実際の文字数_NVARCHAR
UNION ALL
SELECT
'Text2' AS TextName,
@Text2 AS Value,
LEN(@Text2) AS LEN_文字数,
DATALENGTH(@Text2) AS DATALENGTH_バイト数,
DATALENGTH(@Text2) / 2 AS 実際の文字数_NVARCHAR;
-- ❌ 期待通りに動作しない可能性
IF LEN(@InputString) = 0
PRINT '空文字列です'
-- ⭕ スペースのみの文字列も検出したい場合
IF LEN(LTRIM(RTRIM(@InputString))) = 0
PRINT '空文字列またはスペースのみです'-- LENだけでは不十分な場合がある
SELECT LEN(UserInput) -- 末尾スペースは無視される
-- 実際のデータ長を確認したい場合
SELECT DATALENGTH(UserInput) / 2 -- NVARCHARの場合は2で割る-- ========================================
-- SQL4: 空白のみの文字列の扱い
-- ========================================
DECLARE @OnlySpaces NVARCHAR(50) = ' '; -- 半角スペース5文字
SELECT
'[' + @OnlySpaces + ']' AS 元の文字列,
LEN(@OnlySpaces) AS LEN結果,
DATALENGTH(@OnlySpaces) AS DATALENGTH結果,
CASE
WHEN LEN(@OnlySpaces) = 0 THEN '空とみなされる'
ELSE '空ではない'
END AS LENでの判定,
CASE
WHEN DATALENGTH(@OnlySpaces) = 0 THEN '空とみなされる'
ELSE '空ではない'
END AS DATALENGTHでの判定;
-- ========================================
-- SQL5: バリデーション例
-- ========================================
-- パターン1: 空文字列またはスペースのみをチェック
DECLARE @UserInput NVARCHAR(100) = ' ';
IF LEN(LTRIM(RTRIM(@UserInput))) = 0
PRINT '入力が空です';
ELSE
PRINT '有効な入力です: ' + @UserInput;
-- パターン2: 最小文字数チェック(空白を除いた実質的な長さ)
DECLARE @Username NVARCHAR(50) = 'User ';
IF LEN(LTRIM(RTRIM(@Username))) < 3
PRINT 'ユーザー名は3文字以上必要です';
ELSE
PRINT 'ユーザー名OK: 実質文字数=' + CAST(LEN(LTRIM(RTRIM(@Username))) AS NVARCHAR);
-- パターン3: データの実サイズチェック
DECLARE @Description NVARCHAR(200) = 'This is a test ';
SELECT
'Description' AS ColumnName,
LEN(@Description) AS 表示文字数,
DATALENGTH(@Description) / 2 AS 実際の文字数,
DATALENGTH(@Description) AS 使用バイト数;

DATALENGTHを使用LTRIMとRTRIMの併用も検討LENDATALENGTHDATALENGTH ÷ 2(NVARCHAR の場合)