T-SQL 文字列の分割: 欠落している区切り文字に対処する
一貫性のない区切り文字を含むデータには、区切り文字の欠落シナリオを確実に処理する必要があります。 よくある問題を調べてみましょう:
FirstName/LastName
形式で名前を格納する「Name」列を持つテーブル (「MyTable」) を想像してください。 ただし、一部のエントリには「/」区切り文字が含まれていない可能性があります:
<code>FirstName---LastName John--------Smith Jane--------Doe Steve-------NULL -- Missing delimiter Bob---------Johnson</code>
次のような単純な SUBSTRING
と CHARINDEX
のアプローチは、区切り文字が存在しない場合には失敗します。
<code class="language-sql">SELECT SUBSTRING(Name, 1, CHARINDEX('/', Name)-1) AS FirstName, SUBSTRING(Name, CHARINDEX('/', Name) + 1, 1000) AS LastName FROM MyTable;</code>
「LEFT 関数または SUBSTRING 関数に渡された長さのパラメーターが無効です」というエラーは、区切り文字が見つからない場合に CHARINDEX
が 0 を返し、部分文字列の長さが負になるために発生します。
解決策: 条件付き部分文字列抽出
この解決策には、部分文字列の長さを条件付きで決定する CASE
ステートメントが含まれます。
<code class="language-sql">SELECT SUBSTRING(Name, 1, CASE WHEN CHARINDEX('/', Name) = 0 THEN LEN(Name) ELSE CHARINDEX('/', Name) - 1 END) AS FirstName, SUBSTRING(Name, CASE WHEN CHARINDEX('/', Name) = 0 THEN LEN(Name) + 1 ELSE CHARINDEX('/', Name) + 1 END, 1000) AS LastName FROM MyTable;</code>
この洗練されたクエリは、CASE
を使用して両方のシナリオを処理します。
CHARINDEX('/') = 0
): FirstName
の部分文字列の長さが文字列全体の長さ (LEN(Name)
) になり、LastName
部分文字列は末尾の 1 文字後の位置から始まります文字列 (LEN(Name) 1
) の値を返し、事実上 NULL
.SUBSTRING
ロジックが適用されます。この堅牢なアプローチにより、区切り文字の有無に関係なく正しい結果が保証され、「無効な長さパラメーター」エラーが防止されます。
以上がT-SQL で文字列を分割するときに欠落している区切り文字を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。