2010-07-12 10 views
8

Ich habe den folgenden Code für die Handhabung von Telefonnummern wie Ländercode für Australien +61, 61, 001161 usw. Das Problem, das ich habe, kann ich keine CASE-Anweisung mehr unter: CASE WHEN LEFT(@BPartyNo, 4) = '+610'Case-Ausdrücke dürfen nur bis Level 10 verschachtelt werden

Es sagte, dass Xzx74 Case Ausdrücke darf nur auf Level 10 verschachtelt werden

Wie rationalisiere ich diese TSQL, damit ich mehr CASE setzen kann?

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 

Antwort

12

Sie müssen nicht verschachtelt werden überhaupt:,

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 

persönlich Ich würde Ihren Code so umstrukturieren, dass Sie sicherstellen, dass die Daten auf Eingabe sterilisiert werden, anstatt zu versuchen, ihn jetzt zu bereinigen (wenn es eindeutig zu spät ist ...). Oder zumindest die Konvertierung in Ihrer Client-Sprache (d. H. In was auch immer ist Aufruf dieser Sproc), die hoffentlich besser für die Aufgabe der String-Manipulation als T-SQL ist.

+0

'codeka' Harding: Danke dafür. Habe nicht bemerkt, dass ich nicht verschachtelt habe. Ich muss auf dieser Ebene für die String-Manipulation tun, da der Client SQL ist und auch ETL-Prozess. – dcpartners

+0

@ dewacorp.alliances: autsch :-) –

9

Sie brauchen nicht die Case-Anweisungen zu verschachteln, können Sie haben viele WHEN ... THEN

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

Dies ist eine Problemumgehung für das verschachtelte Szenario, nicht empfohlen. Haben Sie Ihre ersten 9 Fälle in einem Coalesce, dann beenden Sie es mit einem else null und setzen Sie die nächsten Fälle in den nächsten Block.

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 
Verwandte Themen