[解決済み] Case表現はレベル10までしかネストできない
2022-02-26 12:03:03
質問
オーストラリアの国番号など、電話番号を処理するために以下のようなコードを用意しました。
+61
,
61
,
001161
などです。問題点は
CASE
の下にあるステートメントを使用することができなくなりました。
CASE WHEN LEFT(@BPartyNo, 4) = '+610'
と書かれていました。 Case 式はレベル 10 までしかネストできません。
このTSQLを効率化して、もっとCASEを入れられるようにするにはどうしたらいいですか?
USE [TelcoStage_PROD]
GO
/****** Object: UserDefinedFunction [dbo].[ufn_stg_ProperBPartyNoExtra] Script Date: 07/12/2010 15:27:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--=====================================================================================================================
-- OBJECT NAME : dbo.ufn_stg_ProperBPartyNoExtra
-- INPUTS : @BPartyNo
-- OUTPUTS : VARCHAR(32)
-- RETURN CODES : N/A
-- DEPENDENCIES : N/A
-- DESCRIPTION : This function is used to get the extra after 10 character (MNET or S)
--
-- EXAMPLES (optional) : N/A
--
-- HISTORY:
-- #-----------------------------------------------------------------------------------------------------------------
-- # DATE | VERSION | MODIFIED BY | DESCRIPTION
-- #-----------------------------------------------------------------------------------------------------------------
====================================================================================================================
ALTER FUNCTION [dbo].[ufn_stg_ProperBPartyNoExtra](@BPartyNo AS VARCHAR(MAX))RETURNS VARCHAR(32)
AS
BEGIN
DECLARE @Return VARCHAR(32);
SET @Return = '';
IF (LEN(@BPartyNo) > 0)
SELECT @Return = CASE WHEN LEFT(@BPartyNo, 4) = '+610' THEN SUBSTRING('0' + SUBSTRING(@BPartyNo, 5, LEN(@BPartyNo)), 11, LEN( '0' + SUBSTRING(@BPartyNo, 5, LEN(@BPartyNo)) ) ) ELSE
CASE WHEN LEFT(@BPartyNo, 3) = '+61' THEN SUBSTRING('0' + SUBSTRING(@BPartyNo, 4, LEN(@BPartyNo)), 11, LEN( '0' + SUBSTRING(@BPartyNo, 4, LEN(@BPartyNo)) ) ) ELSE
CASE WHEN LEFT(@BPartyNo, 2) = '61' THEN SUBSTRING('0' + SUBSTRING(@BPartyNo, 3, LEN(@BPartyNo)), 11, LEN( '0' + SUBSTRING(@BPartyNo, 3, LEN(@BPartyNo)) ) ) ELSE
CASE WHEN LEFT(@BPartyNo, 6) = '001161' THEN SUBSTRING('0' + SUBSTRING(@BPartyNo, 7, LEN(@BPartyNo)), 11, LEN( '0' + SUBSTRING(@BPartyNo, 7, LEN(@BPartyNo)) ) ) ELSE
CASE WHEN ( LEFT(@BPartyNo,2) = '01' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo)) ELSE
CASE WHEN ( LEFT(@BPartyNo,2) = '02' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo)) ELSE
CASE WHEN ( LEFT(@BPartyNo,2) = '03' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo)) ELSE
CASE WHEN ( LEFT(@BPartyNo,2) = '04' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo)) ELSE
CASE WHEN ( LEFT(@BPartyNo,2) = '07' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo)) ELSE
CASE WHEN ( LEFT(@BPartyNo,2) = '08' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo)) ELSE '' END
END
END
END
END
END
END
END
END
END;
ELSE
SELECT @Return = '';
RETURN @Return
END
解決方法は?
入れ子にする必要は全くありません。
SELECT @Return = CASE WHEN LEFT(@BPartyNo, 4) = '+610' THEN SUBSTRING('0' + SUBSTRING(@BPartyNo, 5, LEN(@BPartyNo)), 11, LEN( '0' + SUBSTRING(@BPartyNo, 5, LEN(@BPartyNo)) ) )
WHEN LEFT(@BPartyNo, 3) = '+61' THEN SUBSTRING('0' + SUBSTRING(@BPartyNo, 4, LEN(@BPartyNo)), 11, LEN( '0' + SUBSTRING(@BPartyNo, 4, LEN(@BPartyNo)) ) )
WHEN LEFT(@BPartyNo, 2) = '61' THEN SUBSTRING('0' + SUBSTRING(@BPartyNo, 3, LEN(@BPartyNo)), 11, LEN( '0' + SUBSTRING(@BPartyNo, 3, LEN(@BPartyNo)) ) )
WHEN LEFT(@BPartyNo, 6) = '001161' THEN SUBSTRING('0' + SUBSTRING(@BPartyNo, 7, LEN(@BPartyNo)), 11, LEN( '0' + SUBSTRING(@BPartyNo, 7, LEN(@BPartyNo)) ) )
WHEN ( LEFT(@BPartyNo,2) = '01' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo))
WHEN ( LEFT(@BPartyNo,2) = '02' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo))
WHEN ( LEFT(@BPartyNo,2) = '03' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo))
WHEN ( LEFT(@BPartyNo,2) = '04' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo))
WHEN ( LEFT(@BPartyNo,2) = '07' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo))
WHEN ( LEFT(@BPartyNo,2) = '08' AND LEN(@BPartyNo) > 10 ) THEN SUBSTRING(@BPartyNo, 11, LEN(@BPartyNo))
ELSE ''
END
個人的には、コードを再構築して、次の時点でデータがサニタイズされていることを確認するようにします。 入力 今更サニタイズするのではなく(明らかに手遅れなのに...)。あるいは、少なくとも、クライアント言語(すなわち 呼び出し この sproc は T-SQL よりも文字列操作のタスクに適していることが期待されます。
関連
-
[解決済み】''付近の構文が正しくない
-
[解決済み] varchar データ型から datetime データ型に変換すると、SQL クエリで範囲外の値が発生する
-
[解決済み】データベースへの「ネイティブ」SQL接続を使用するとはどういう意味ですか?
-
[解決済み] 集計を行わずに行から列へピボット移動する
-
[解決済み] SQLです。最初の出現箇所のみを返す
-
[解決済み] Ruby On Rails で NuoDB を使用して SQL コマンドを手動で実行する方法
-
[解決済み] マルチパート識別子をバインドできなかった
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] T-SQLで数字と文字列を結合して数字をフォーマットするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】集約関数のないTSQLピボット
-
[解決済み】単一のクエリで加重平均を計算する
-
[解決済み] アンピボットの主キーを含む対象コードページで、テキストが切り捨てられたか、1つ以上の文字が一致しない。
-
[解決済み] ORA-12801: 並列クエリサーバー P004 および ORA-01555 でシグナルされたエラー: スナップショットが古すぎる。
-
[解決済み] Presto SQL ピボッティング(言葉は悪いですが)データ
-
[解決済み] "このSqlTransactionは完了しました。もう使用できません。"...設定エラー?
-
[解決済み] Oracle(LiveSQL)のSQL [重複]について
-
[解決済み] 検索エラー ORA-00932: 不整合なデータ型: 期待された DATE は NUMBER になりました。
-
[解決済み] SQLでchar値をmoneyに変換できない
-
[解決済み] オペランド型の衝突:uniqueidentifierはintと互換性がない