2015-04-29 18 views
8

का चयन करना मुझे() के बीच एक सबस्ट्रिंग चुनने की आवश्यकता है। प्रारंभिक और समापन स्थिति अलग-अलग होगी, साथ ही साथ सबस्ट्रिंग की लंबाई भी अलग-अलग होगी। मुझे निम्नलिखित के साथ मध्यम सफलता मिली है लेकिन 100% नहीं है।सबस्ट्रिंग एसक्यूएल

यह कुछ मूल्यों के लिए काम करेगा, लेकिन दूसरों के लिए नहीं, यह रिक्त स्थान लौटाएगा और मूल्यों का पूंजीकरण प्रारूप भी बदल देगा, यदि मूल्य 'टेस्ट' है तो यह 'टेस्ट' के रूप में प्रदर्शित होगा।

SELECT SUBSTRING(columnName, CHARINDEX('(', LEN(columnName)), 
CHARINDEX(')', columnName) - CHARINDEX('(',columnName)) AS INPUT 
FROM tableName 

अद्यतन वहाँ कोष्ठक()

+0

कोई रास्ता नहीं है कि क्वेरी स्ट्रिंग के मामले में बदल जाएगा नहीं है, आपको एक उदाहरण प्रदान कर सकते हैं? – DavidG

+0

तो क्या आप स्पष्ट कर सकते हैं - आपको अपनी क्वेरी के साथ किस समस्या का सामना करना पड़ा है? और यह कैरेक्टर केस बदलने के लिए कैसे चिंतित है? –

+0

चरित्र मामले मेरी चिंताओं का सबसे कम है। मेरी सबसे बड़ी चिंता यह है कि यह क्वेरी कुछ मूल्यों के लिए() के बीच सही सबस्ट्रिंग का चयन करेगी, लेकिन अन्य के लिए यह पूरी तरह याद आ जाएगी। – Rene

उत्तर

6

यह आपको केवल ( की एक एकल घटना और ) है प्रदान की काम करेगा का केवल 1 सेट है:

SELECT 
    SUBSTRING(columnName, 
       CHARINDEX('(', columnName)+1, 
       CHARINDEX(')', columnName) - CHARINDEX('(', columnName)-1) 
FROM tableName 

आप मूल्य सेट किया है कि कोई (...) सामग्री नहीं है, यह कहां जोड़ें:

WHERE CHARINDEX('(', columnName) > 0 AND 
     CHARINDEX(')', columnName) > CHARINDEX('(', columnName) 
+0

यह क्वेरी मुझे निम्न त्रुटि देता है: बाएं या सबस्ट्रिंग फ़ंक्शन को पास किया गया अमान्य लंबाई पैरामीटर। – Rene

+0

तब आपके सभी डेटा में '(....)' मान नहीं है। मैंने इसका सामना करने के लिए 'WHERE' क्लॉज जोड़ा है। – DavidG

1

Postgres में, आप इस का उपयोग कर POSIX रेगुलर एक्सप्रेशन कैप्चर कर सकते हैं:

=> select substring('This (might) work' from '[(](.*)[)]'); 
substring 
----------- 
might 

यह एसक्यूएल सर्वर प्रतीत होता है की पेशकश करता है regexp support, लेकिन मैं इसे से परिचित नहीं हूं और मुझे एक को चलाने के लिए एक मंच की जरूरत नहीं है परीक्षण का मामला। यह विशेष उदाहरण मुश्किल है क्योंकि आपको डिलीमीटर () दाएं उद्धरण प्राप्त करना होगा।

+0

यह सुनिश्चित नहीं है कि यह एक उत्तर है, SQL सर्वर में ऐसा कुछ भी नहीं है! – DavidG

+0

आरईजीएक्स केवल सीएलआर आधारित प्रो (यानी एक संग्रहित प्रो, उदाहरण के लिए, सी #) का उपयोग करते समय उपलब्ध है, ऐसा कुछ नहीं जो मैं इस मामले में अनुशंसा करता हूं। – DavidG

2

नहीं, नेस्टेड या अधूरा को दर्शाने के लिए ()

;with t(f) as (
    select 'aaa(bbb)ccc' union 
    select 'aaa(bbbccc' union 
    select 'aaabbb)ccc' union 
    select 'aaa()ccc' union 
    select '(aaa(?))ccc' 
) 

select f, 
case when patindex('%(%)%', f) > 0 
    then substring(f, charindex('(', f) + 1, (len(f) - charindex(')', reverse(f))) - charindex('(', f)) 
    else '' 
end 
from t 

>> 

f    (No column name) 
aaa()ccc  
aaa(bbb)ccc bbb 
(aaa(?))ccc aaa(?) 
aaa(bbbccc 
aaabbb)ccc 
संबंधित मुद्दे