2010-07-12 17 views
8

tengo el siguiente código para el manejo de los números telefónicos tales como el código de país para Australia +61, 61, 001161 etc. El problema que tengo no puedo insertar cualquier declaración CASE más bajo: CASE WHEN LEFT(@BPartyNo, 4) = '+610'expresiones caso, sólo se pueden anidar a nivel 10

se dice que expresiones caso, sólo se pueden anidar a nivel 10

¿Cómo agilizar este TSQL para que pueda poner más CASO?

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 

Respuesta

12

que no necesitan ser anidado en absoluto:

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, Me gustaría reestructurar su código para asegurarse de que los datos se desinfectaron al entrada, en lugar de tratar de desinfectarlo ahora (cuando es claramente demasiado tarde ...). O al menos realice la conversión en el idioma de su cliente (es decir, en lo que sea llamando al este sproc), que es más apropiado para la tarea de manipulación de cadenas que T-SQL.

+0

'codeka' Harding: Gracias por esto. No me di cuenta de que no he anidado. Tengo que hacerlo en este nivel para la manipulación de cadenas debido a que el cliente también es SQL y qué proceso de ETL. – dcpartners

+0

@ dewacorp.alliances: ouch :-) –

9

No es necesario para anidar las declaraciones de casos, puede tener muchas WHEN ... THEN

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

Esto es una solución para el escenario de caso anidado, no recomendado. Tenga sus primeros 9 CASOS en un Coalesce, luego termínelos con un else null y coloque los siguientes casos en el siguiente bloque.

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 
Cuestiones relacionadas