2015-04-29 18 views
8

Devo selezionare una sottostringa che si trova tra(). La posizione iniziale e finale varierà, così come la lunghezza della sottostringa. Ho avuto un successo moderato con il seguente, ma non al 100%.Selezione sottostringa SQL

Funzionerà per alcuni valori ma non per gli altri, restituisce spazi vuoti e cambierà anche il formato di capitalizzazione dei valori, in altre parole se il valore è 'TEST' verrà visualizzato come 'Test'.

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

aggiornamento C'è solo 1 set di parentesi()

+0

Non c'è modo tale query cambierà il caso della stringa, si può fornire un esempio? – DavidG

+0

Quindi puoi chiarire: che problema hai riscontrato con la tua domanda? E in che modo è interessato al cambio di caso dei personaggi? –

+0

Il caso del personaggio è l'ultima delle mie preoccupazioni. La mia più grande preoccupazione è che questa query selezionerà la sottostringa corretta tra() per alcuni valori, ma per gli altri mancherà completamente. – Rene

risposta

6

questo sarà il lavoro a patto di avere una sola occorrenza di ( e ):

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

Se si dispone di valori che non hanno alcun contenuto (...), aggiungere questo dove clausola:

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

Questa query mi dà il seguente errore: Parametro di lunghezza non valido passato alla funzione SINISTRA o SUBSTRING. – Rene

+0

Quindi non tutti i tuoi dati hanno un valore '(....)'. Ho aggiunto una clausola 'WHERE' per far fronte a questo. – DavidG

1

In Postgres, è possibile farlo utilizzando POSIX regolare cattura espressione:

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

Sembra SQL server non offrire regexp support, ma non sono familiarità con esso e io non avere una piattaforma per l'esecuzione di un test case. Questo particolare esempio è complicato perché devi ottenere la citazione dei delimitatori () a destra.

+0

Non sicuro che questa sia una risposta, non c'è niente di simile in SQL Server! – DavidG

+0

REGEX è disponibile solo quando si utilizza un proc basato su CLR (vale a dire un processo memorizzato scritto, ad esempio, C#), non è una cosa che consiglierei in questo caso. – DavidG

2

Per rappresentano il no, nidificato o incomplete ()

;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