2010-07-12 14 views
8

स्तर नेस्ट किया जा सकता है मैं इस तरह ऑस्ट्रेलिया +61, 61, 001161 के लिए देश कोड के रूप में फोन नंबर से निपटने के लिए निम्न कोड आदि समस्या यह है कि मुझे लगता है मैं अब और के तहत किसी भी CASE बयान सम्मिलित नहीं कर सकते हैं: CASE WHEN LEFT(@BPartyNo, 4) = '+610'प्रकरण भाव केवल 10

कहा जाता है कि प्रकरण भाव केवल स्तर 10

मैं इस TSQL कैसे को कारगर है तो मैं अधिक मामले रख सकते हैं करने के लिए नेस्ट किया जा सकता है?

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 

उत्तर

12

वे बिल्कुल नेस्ट किए जाने की जरूरत नहीं है हो सकता है:

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 

व्यक्तिगत रूप से, मैं आपके कोड को पुन: स्थापित करूंगा ताकि आप यह सुनिश्चित कर सकें कि इनपुट पर संतोषजनक डेटा को अब इसे स्वच्छ करने की कोशिश करने के बजाय (जब यह स्पष्ट रूप से बहुत देर हो चुकी है ...)। या कम से कम अपनी क्लाइंट भाषा में रूपांतरण करें (यानी जो भी इस स्पोक को कॉल कर रहा है), जो उम्मीद है कि टी-एसक्यूएल की तुलना में स्ट्रिंग मैनिपुलेशन के कार्य के लिए अधिक उपयुक्त है।

+0

'कोडेका' हार्डिंग: इसके लिए धन्यवाद। मुझे एहसास नहीं हुआ कि मैंने घोंसला नहीं किया है। क्लाइंट के कारण स्ट्रिंग मैनिपुलेशन के लिए मुझे इस स्तर पर करना है वास्तव में एसक्यूएल के साथ ही ईटीएल प्रक्रिया भी है। – dcpartners

+0

@ dewacorp.alliances: ouch :-) –

9

आप मामले बयान घोंसला की जरूरत नहीं है, आप कई WHEN ... THEN

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

यह नेस्टेड केस परिदृश्य के लिए एक कामकाज है, जो कि पुनः नहीं है। कोलेसे में अपना पहला 9 सीएएसईएस रखें, फिर इसे एक और शून्य के साथ समाप्त करें और अगले मामलों को अगले ब्लॉक में रखें।

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 
संबंधित मुद्दे