2015-04-29 6 views
8

Potrzebuję wybrać podła, która znajduje się między(). Pozycja początkowa i końcowa będą się różnić, podobnie jak długość podłańcucha. Miałem umiarkowany sukces z następującymi, ale nie w 100%.Wybór podłańcucha SQL

Będzie działać dla niektórych wartości, ale nie dla innych, zwraca puste znaki, a także zmieni format wielkich liter, innymi słowy, jeśli wartość to "TEST", wyświetli się jako "Test".

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

Aktualizacja Jest tylko 1 zestaw nawiasach()

+0

Nie ma mowy, że kwerenda zmieni przypadek podciągu, można podać przykład? – DavidG

+0

Więc możesz wyjaśnić - z jakim problemem spotkałeś się z zapytaniem? A jak to się dzieje w przypadku zmiany postaci? –

+0

Sprawa z postaciami to najmniejszy z moich problemów. Moim największym zmartwieniem jest to, że to zapytanie wybierze poprawny podłańcuch między() dla niektórych wartości, ale dla innych będzie całkowicie pomijany. – Rene

Odpowiedz

6

to będzie działać pod warunkiem, że tylko jedno wystąpienie ( i ):

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

Jeśli masz wartości, które nie zawierają żadnej treści z zakresu (...), należy dodać tę klauzulę, tam gdzie:

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

To zapytanie powoduje następujący błąd: Nieprawidłowy parametr długości przekazywany do funkcji LEFT lub SUBSTRING. – Rene

+0

Wtedy nie wszystkie twoje dane mają wartość '(....)'. Dodałem klauzulę "WHERE", aby sobie z tym poradzić. – DavidG

1

W PostgreSQL, można to zrobić za pomocą regularnych POSIX przechwytywanie wyrażenie:

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

Wydaje serwera SQL daje regexp support, ale nie jestem zaznajomiony z nim i nie mam platformę do uruchamiania przypadek testowy. Ten konkretny przykład jest trudny, ponieważ musisz poprawnie cytować ograniczniki ().

+0

Nie jestem pewien, czy to jest odpowiedź, nie ma czegoś takiego w SQL Server! – DavidG

+0

REGEX jest dostępny tylko wtedy, gdy używasz procesu opartego na CLR (tj. Zapisanego procesu napisanego na przykład w C#), a nie czegoś, co polecałbym w tym przypadku. – DavidG

2

Aby uwzględnić nie, zagnieżdżone lub niekompletne ()

;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