2010-07-12 13 views
8

ho il seguente codice per la gestione di numeri di telefono, come il codice Paese per l'Australia +61, 61, 001161 ecc Il problema che ho non posso inserire alcun CASE dichiarazione più sotto: CASE WHEN LEFT(@BPartyNo, 4) = '+610'espressioni CASE possono essere annidati solo al livello 10

dire che espressioni CASE possono essere annidati solo al livello 10

Come faccio a snellire questo TSQL così posso mettere più 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 

risposta

12

Essi non hanno bisogno di essere nidificati a tutti:

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 

Personalmente, Vorrei ristrutturare il tuo codice in modo da assicurarti che i dati siano sterilizzati su input, invece di provare a disinfettarlo ora (quando è chiaramente troppo tardi ...). O almeno eseguire la conversione nella lingua del client (ad esempio, in qualsiasi cosa è chiamando lo questo sproc), che si spera sia più adatto all'attività di manipolazione delle stringhe rispetto a T-SQL.

+0

'codeka' Harding: Grazie per questo. Non ho capito che non ho nidificato. Devo fare a questo livello per la manipolazione delle stringhe, perché il client è in realtà SQL e il processo ETL. – dcpartners

+0

@ dewacorp.alliances: ahi :-) –

9

Non è necessario annidare le istruzioni case, si può avere molti WHEN ... THEN

CASE WHEN @x = 1 THEN 1 WHEN @x = 2 THEN 2 WHEN @x = 3 THEN 3 ELSE 4 END 
0

Questa è una soluzione alternativa per lo scenario caso nidificato, non consigliato. Avere i primi 9 CASES in un Coalesce, quindi terminarlo con un altro null e inserire i prossimi casi nel blocco successivo.

COALESCE ((CASE WHEN TRY1 = 1 THEN TRY1  
ELSE CASE WHEN TRY2 = 1 THEN TRY2 
ELSE CASE WHEN TRY3 = 1 THEN TRY3 
ELSE NULL END END 
END), 

CASE WHEN TRY11 = 1 THEN TRY11 
ELSE CASE WHEN TRY12 = 1 THEN TRY12 
ELSE CASE WHEN TRY13 = 1 THEN TRY13 
ELSE NULL END END END 
),0) AS MyValue 
Problemi correlati