2013-09-25 9 views
5

Ho bisogno di estrarre tutti i caratteri a destra di un trattino come parte di un'istruzione select. Ci saranno altre colonne nella selezione. Nella query seguente, i tre caratteri giusti sono selezionati dalla seconda colonna. Come estrarre un numero indefinito di caratteri a destra di un delimitatore - nel mio caso un trattino? Posso usare la funzione giusta? Devo usare un'altra funzione?Estrarre i caratteri a destra di un valore delimitato in un'istruzione SELECT

Select column1, right(column2,3) as extracted, column3 
From myTable 

Sto usando 2008.

+0

Quale versione di SQL stiamo guardando? – Paul

risposta

13

Questa domanda di SQL Server ha una risposta specifica banca dati.

Se si utilizza SQL Server:

SELECT column1 
    , RIGHT(column2,CHARINDEX('-',REVERSE(column2))-1) as extracted 
    , column3 
FROM myTable 

è possibile aggiungere una dichiarazione CASE o utilizzare NULLIF() nel caso in cui il trattino non è sempre presente:

SELECT column1 
    , CASE WHEN column2 LIKE '%-%' THEN RIGHT(column2,CHARINDEX('-',REVERSE(column2))-1) 
      END as extracted 
    , column3 
FROM myTable 

Oppure:

SELECT column1 
    , RIGHT(column2,NULLIF(CHARINDEX('-',REVERSE(column2)),0)-1) as extracted 
    , column3 
FROM myTable 

Se si utilizza MySQL, è sufficiente cambiare CHARINDEX() in LOCATE(). Credo che Oracle sia INSTR() e che i primi due parametri siano commutati, prima è la stringa in cui stai cercando, quindi la stringa che stai cercando.

+0

Sto usando SQL Server. Ho appena modificato l'argomento per includerlo. Grazie per la risposta rapida. – user2525015

+0

Ricevo il messaggio "parametro lunghezza non valida" con quanto sopra. È interpretare il -1 come una lunghezza. La query funziona se sostituisco un numero positivo. Posso ottenere quanto sopra per lavorare per una lunghezza non specificata? – user2525015

+0

Ciò accade quando non c'è alcun trattino, la seconda query è costruita per quello. –

1

ne dite:

SUBSTRING(column2, CHARINDEX('-',column2)+1, 8000) 

(. Sostituire 8000 con la definizione della colonna)

Naturalmente se la colonna non può sempre contenere un trattino, allora si può dire:

SUBSTRING(column2, COALESCE(NULLIF(CHARINDEX('-',column2)+1,1),1),8000) 

Se la colonna non contiene un trattino, otterrai l'intera colonna. Se si desidera escludere quelli dal risultato, è possibile aggiungere una clausola WHERE:

WHERE CHARINDEX('-', column2) > 0 

Oppure si può utilizzare un CASE espressione come la risposta di capra CO.

+0

Grazie. Cosa intendi per definizione della colonna? Intendi il tipo? – user2525015

+0

@ user2525015 Intendo la lunghezza. VARCHAR (255), VARCHAR (8000), ecc. –

+0

Ciò causa l'errore "varchar non è un nome di funzione incorporato". Sto usando SQL Server 2008. Inizialmente ho trascurato di includerlo. Non so se questo ha qualcosa a che fare con l'errore. – user2525015