CASE 式を使用できます。
SELECT *
FROM dbo.IpPbxCDR
WHERE CASE WHEN dbo.IpPbxCDR.OriginationNumber LIKE '+31%'
THEN '0' + Right(dbo.IpPbxCDR.OriginationNumber,9)
ELSE Replace(dbo.IpPbxCDR.OriginationNumber,'+','00'))
END = '0201234567';
注意:これは、スキーマで呼び出されたテーブルではなく、呼び出されたテーブルを探しているため、 に置き換えまし[dbo.IpPbxCDR]
た。dbo.IpPbxCDR
dbo.IpPbxCDR
IpPbxCDR
dbo
補遺
それが当てはまるかどうかはわかりませんが、上記は onOriginationNumber
にある可能性のあるインデックスを使用しません。select で式を使用している場合は問題ありませんが、where 句でそのまま使用すると、パフォーマンスの問題が発生する可能性があります。 . インデックスを使用するには、次のように書き換えることができます。
DECLARE @Number VARCHAR(10) = '0201234567';
SELECT *
FROM dbo.IpPbxCDR
WHERE OriginationNumber = CASE WHEN @Number LIKE '00%' THEN STUFF(@Number, 1, 2, '+') ELSE STUFF(@Number, 1, 1, '+31') END;
これにより、定数に対するすべての操作が行われるため、すべての行で関数を実行するのではなく、一度だけ実行されます。比較を行うために、これは ablve を実行したときの実行計画 (上) と最初のクエリ (下) を比較したものです。

テストスキーマ
CREATE TABLE dbo.IpPbxCDR (OriginationNumber VARCHAR(15));
INSERT dbo.IpPbxCDR (OriginationNumber)
VALUES ('+31201234567'), ('+3469694535'), ('+44208979754');
INSERT dbo.IpPbxCDR (OriginationNumber)
SELECT TOP 10000 '+312012' + RIGHT('0000' + CAST(ROW_NUMBER() OVER(ORDER BY a.Object_ID) AS VARCHAR(5)), 5)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b
UNION ALL
SELECT TOP 10000 '+342012' + RIGHT('0000' + CAST(ROW_NUMBER() OVER(ORDER BY a.Object_ID) AS VARCHAR(5)), 5)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b
UNION ALL
SELECT TOP 10000 '+332012' + RIGHT('0000' + CAST(ROW_NUMBER() OVER(ORDER BY a.Object_ID) AS VARCHAR(5)), 5)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b
CREATE NONCLUSTERED INDEX IX_IpPbxCDR_OriginationNumber ON dbo.IpPbxCDR (OriginationNumber);