2013-06-12 7 views
5

में विशिष्ट वर्चर के लिए लाइनों की संख्या प्राप्त करें एमएस एसक्यूएल सर्वर 2012 में मेरे पास एक वर्चुअल कॉलम वाला एक डेटाबेस है जिसमें कुछ पाठ है जिसमें लाइन ब्रेक भी शामिल हो सकते हैं।एमएस एसक्यूएल

बुनियादी उदाहरण:

-------------------- 
| ID | LinesOfText | 
-------------------- 
| 1 |   1 | 
-------------------- 
| 2 |   3 | 
-------------------- 
| 3 |   2 | 
-------------------- 

दुर्भाग्य से, वहाँ होना प्रतीत नहीं होता है:

CREATE TABLE Example 
(
    [ID] INT 
    , [Text] VARCHAR(100) 
); 

INSERT INTO Example ([ID], [Text]) 
VALUES 
     (1, 'This is a test'), 
     (2, 'This is another 
     test with 
     two line breaks'), 
     (3, 'This is a test 
     with one line break'); 

अब मैं प्रत्येक रिकॉर्ड, यानी, कुछ इस तरह के लिए पाठ की पंक्तियों प्राप्त करना चाहते हैं इस तरह के कुछ के लिए एक अंतर्निहित कार्यों। मेरा विचार Chr(10)+Chr(13) घटनाओं को गिनना था और अंत में 1 जोड़ना था। लेकिन CHARINDEX केवल एक स्ट्रिंग में पहली घटना पाता है।

कोई विचार यह कैसे हल करें?

अतिरिक्त जानकारी जो उपयोगी हो सकती है: मेरे डेटा की गहरी अंतर्दृष्टि देने के लिए, "टेक्स्ट" एक एक्सएमएल स्ट्रिंग से आ रहा है जिसमें लाइन ब्रेक, उदा।

... 
<a>This is 
    another test 
    with two line breaks</a> 
... 

मैं CROSS APPLY XML.nodes(... और XPath का उपयोग एक्सएमएल में सभी <a> नोड्स खोजने के लिए। क्या इसे सीधे टी-एसक्यूएल एक्सएमएल कार्यों के साथ हल किया जा सकता है?

+0

धन्यवाद, पहले से ही बदल दिया है। मैंने इसे sqlfiddle.com से कॉपी किया लेकिन मुझे पता नहीं था कि मैं अच्छे उत्तर के लिए MySQL मोड – Markus

उत्तर

7

कुछ भी ('') के साथ स्थानांतरित करके लाइन ब्रेक को खत्म करने के लिए Replace का उपयोग करें। फिर आप मूल से संशोधित पाठ की लंबाई को घटा सकते हैं।

+0

+1 में हूं। – Devart

+0

धन्यवाद, यह ठीक काम करता प्रतीत होता है! – Markus

+0

मैं गैर-खाली रेखाओं को कैसे गिन सकता हूं? – BlueChippy

4

इस प्रयास करें:

select id, text,LEN(Text)-LEN(replace(text,char(10),''))+1 LinesOfText 
from Example 
+0

@ मार्कस: क्या इससे मदद मिलती है? अच्छे उत्तर के लिए –

+1

+1। – Devart

+3

आपके उत्तर और उदाहरण के लिए धन्यवाद! अच्छा कर रहा है! – Markus

6

इस एक का प्रयास करें -

क्वेरी:

DECLARE @XML XML 
SELECT @XML = '<p> 
<a>This is a test</a> 
<a>This is 
    another test 
    with two line breaks</a> 
<a>This is a test 
    with one line break</a> 
</p>' 

SELECT 
     id = ROW_NUMBER() OVER (ORDER BY (SELECT 1)) 
    , LinesOfText = LEN(txt) - LEN(REPLACE(txt, CHAR(10), '')) + 1 
FROM (
    SELECT txt = t.c.value('.', 'VARCHAR(MAX)') 
    FROM @XML.nodes('p/a') t(c) 
) t 

आउटपुट:

id     LinesOfText 
-------------------- -------------------- 
1     1 
2     3 
3     2 
+0

आपकी मदद के लिए धन्यवाद, LEN() और REPLACE() मुझे जो चाहिए वह है। – Markus

+0

आपका स्वागत है @ मार्कस। – Devart

2

कुछ भी नहीं है इस दृष्टिकोण के बारे में चतुर है, और मुझे लगता है कि बदलने के उपयोग के उदाहरण और अधिक सुरुचिपूर्ण हैं, लेकिन यह काफी बेल्ट और ब्रेसिज़ है:

CREATE FUNCTION dbo.fn_LinesOfText(@Text varchar(MAX)) Returns INT As 
Begin 
    Declare @Result int, @LastOffset int 

    SET @LastOffset=0 
    SET @Result=1 
    SET @LastOffset=CHARINDEX(CHAR(10), @Text, @LastOffset) 
    WHILE @LastOffset>=1 BEGIN 
     SET @[email protected]+1 
     SET @LastOffset=CHARINDEX(CHAR(10) ,@Text, @LastOffset+1) 
    END 

    Return @Result 
End 
+1

मेरे पहले दृष्टिकोण को कार्यान्वित करने के तरीके के लिए धन्यवाद, यह उन लोगों के लिए भी उपयोगी हो सकता है जो अपना स्वयं का कार्य लिखना चाहते हैं। – Markus

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