2009-12-05 8 views
10

मेरे पास 'some.file.name' स्ट्रिंग है, मैं 'some.file' को पकड़ना चाहता हूं।एसक्यूएल सर्वर 2005: अंत से शुरू होने वाले charindex

ऐसा करने के लिए, मुझे '।' की अंतिम घटना को खोजने की आवश्यकता है। एक स्ट्रिंग में

मेरे समाधान है:

declare @someStr varchar(20) 

declare @reversedStr varchar(20) 

declare @index int 

set @someStr = '001.002.003' 

set @reversedStr = reverse(@someStr) 

set @index = len(@someStr) - charindex('.',@reversedStr) 

select left(@someStr,@index) 

खैर, यह जटिल नहीं है मैं सिर्फ एक जहां-खंड में 'some.file' का उपयोग करने के लिए intented था?।

किसी के पास कोई अच्छा विचार है?

+0

@Shuo: अपने परिदृश्य के लिए मेरा उत्तर अपडेट करें - बस ठीक काम करना चाहिए। –

+0

धन्यवाद, मार्क! मैंने अपना प्रश्न संशोधित कर दिया है। आप बहुत मददगार हैं! अगर कोई मुझे बेहतर विचार नहीं दे सका, तो मैं आपके उत्तर को चिह्नित करूंगा =) – Shuo

उत्तर

16

आपको इसके साथ क्या करने की ज़रूरत है ?? क्या आपको दिए गए डेलीमीटर के आखिरी मौके के बाद पात्रों को पकड़ने की ज़रूरत है?

यदि ऐसा है तो: स्ट्रिंग रिवर्स और सामान्य CHARINDEX का उपयोग करके खोज: - "।"

declare @test varchar(100) 
set @test = 'some.file.name' 

declare @reversed varchar(100) 
set @reversed = REVERSE(@test) 

select 
    REVERSE(SUBSTRING(@reversed, CHARINDEX('.', @reversed)+1, 100)) 

आप हूँ वापस पाने "some.file" पिछले करने के लिए वर्ण मूल फ़ाइल नाम में।

कोई भी "LASTCHARINDEX" या SQL सर्वर में ऐसा कुछ भी नहीं है। आप SQL सर्वर 2005 और बाद में क्या कर सकते हैं, एक .NET एक्सटेंशन लाइब्रेरी है और SQL सर्वर में एक असेंबली के रूप में इसे तैनात कर रहा है - टी-एसक्यूएल स्ट्रिंग मैनिपुलेशन के साथ बहुत मजबूत नहीं है, जबकि .NET वास्तव में है।

+0

हे मार्क, आपके उत्तर के लिए धन्यवाद। मेरे पास 'some.file.name' जैसी स्ट्रिंग है I LEFT का उपयोग करके 'some.file'if' को पकड़ना चाहता हूं, मुझे अंतिम डिलीमीटर की अनुक्रमणिका जाननी है। क्या आपके पास कुछ हासिल करने का कोई अच्छा विचार है। फ़ाइल '? – Shuo

+0

@ शूओ: क्यों न जाएं और अपना सर्वश्रेष्ठ प्रयास पोस्ट करें। फिर अन्य आपकी सहायता करने के इच्छुक हो सकते हैं। –

+0

@Shuo: अपने परिदृश्य के लिए मेरा उत्तर अपडेट करें - बस ठीक काम करना चाहिए। –

5

यह भी काम करेगा:

DECLARE 
    @test  VARCHAR(100) 

SET @test = 'some.file.name' 

SELECT 
    LEFT(@test, LEN(@test) - CHARINDEX('.', REVERSE(@test))) 
+0

टॉम, हम आंखों को देख रहे हैं! – Shuo

+0

हे! मार्क के कोड को देखने और सभी टिप्पणियों को पढ़ने के बाद, फिर किसी और चीज से विचलित होकर मैं पूरी तरह से भूल गया कि आपका समाधान क्या था :) –

1

एक ')'

declare @test varchar(100) 
set @test = 'some.file.name' 
select left(@test,charindex('.',@test)+charindex('.',@test)-1) 
0

यहाँ एक छोटा संस्करण

DECLARE @someStr varchar(20) 
set @someStr = '001.002.003' 

SELECT REVERSE(Substring(REVERSE(@someStr),CHARINDEX('.', REVERSE(@someStr))+1,20)) 
1
CREATE FUNCTION [dbo].[Instr] (
    ------------------------------------------------------------------------------------------------- 
    -- Name:  [dbo].[Instr] 
    -- Purpose: Find The Nth Value Within A String 
    ------------------------------------------------------------------------------------------------- 
    -- Revisions: 
    -- 25-FEB-2011 - HESSR - Initial Revision 
    ------------------------------------------------------------------------------------------------- 
    -- Parameters: 
    -- 1) @in_FindString - NVARCHAR(MAX) - INPUT - Input Find String 
    -- 2) @in_String - NVARCHAR(MAX) - INPUT - Input String 
    -- 3) @in_StartPos - SMALLINT - INPUT - Position In The String To Start Looking From 
    --   (If Start Position Is Negative, Search Begins At The End Of The String) 
    --   (Negative 1 Starts At End Position 1, Negative 3 Starts At End Position Minus 2) 
    -- 4) @in_Nth - SMALLINT - INPUT - Nth Occurrence To Find The Location For 
    ------------------------------------------------------------------------------------------------- 
    -- Returns: SMALLINT - Position Of String Segment (Not Found = 0) 
    ------------------------------------------------------------------------------------------------- 
    @in_FindString    NVARCHAR(MAX), 
    @in_String     NVARCHAR(MAX), 
    @in_StartPos    SMALLINT   = NULL, 
    @in_Nth     SMALLINT   = NULL 
) 
    RETURNS     SMALLINT 
AS 
BEGIN 

    DECLARE @loc_FindString NVARCHAR(MAX); 
    DECLARE @loc_String NVARCHAR(MAX); 
    DECLARE @loc_Position SMALLINT; 
    DECLARE @loc_StartPos SMALLINT; 
    DECLARE @loc_Nth SMALLINT; 
    DECLARE @loc_Idx SMALLINT; 
    DECLARE @loc_FindLength SMALLINT; 
    DECLARE @loc_Length SMALLINT; 

    SET @loc_FindString = @in_FindString; 
    SET @loc_String = @in_String; 

    SET @loc_Nth = ISNULL(ABS(@in_Nth), 1); 
    SET @loc_FindLength = LEN(@loc_FindString+N'.') - 1; 
    SET @loc_Length = LEN(@loc_String+N'.') - 1; 

    SET @loc_StartPos = ISNULL(@in_StartPos, 1); 
    SET @loc_Idx = 0; 

    IF (@loc_StartPos = ABS(@loc_StartPos)) 
    BEGIN 
     WHILE (@loc_Idx < @loc_Nth) 
     BEGIN 
      SET @loc_Position = CHARINDEX(@loc_FindString,@loc_String,@loc_StartPos); 
      IF (@loc_Position > 0) 
      SET @loc_StartPos = @loc_Position + @loc_FindLength 
      ELSE 
      SET @loc_Idx = @loc_Nth; 
      SET @loc_Idx = @loc_Idx + 1; 
     END; 
    END 
    ELSE 
    BEGIN 
     SET @loc_StartPos = ABS(@loc_StartPos); 
     SET @loc_FindString = REVERSE(@in_FindString); 
     SET @loc_String = REVERSE(@in_String); 
     WHILE (@loc_Idx < @loc_Nth) 
     BEGIN 
      SET @loc_Position = CHARINDEX(@loc_FindString,@loc_String,@loc_StartPos); 
      IF (@loc_Position > 0) 
      SET @loc_StartPos = @loc_Position + @loc_FindLength 
      ELSE 
      SET @loc_Idx = @loc_Nth; 
      SET @loc_Idx = @loc_Idx + 1; 
     END; 
     IF (@loc_Position > 0) 
     SET @loc_Position = @loc_Length - @loc_Position + (1 - @loc_FindLength) + 1; 
    END; 

    RETURN (@loc_Position); 

END; 
GO 
4

एक बहुत ही सरल तरीका है ले लो:

सही चुनें (@ str, charindex ('।', रिवर्स (@str)) - 1)

संबंधित मुद्दे