2011-12-02 4 views
52

Utilizzo T-SQL, come potrei fare per ottenere i ultimi 3 caratteri di una colonna varchar?T-SQL Substring - 3 ultimi caratteri

Così il testo della colonna è IDS_ENUM_Change_262147_190 e ho bisogno 190

risposta

87
SELECT RIGHT(column, 3) 

Questo è tutto ciò che serve.

È inoltre possibile eseguire LEFT() allo stesso modo.

Tenere presente che se si utilizza questa clausola in una clausola WHERE, lo RIGHT() non può utilizzare alcun indice.

+7

Se si * stanno * andando a cercare grandi volumi di dati in questo modo, * è * un modo per recuperare l'uso degli indici. Creare una colonna calcolata che è la stringa in ordine inverso. Quindi quali erano i tre personaggi (meno significativi) giusti sono ora i tre (più significativi) di sinistra. Quindi indicizzate la colonna e cercate 'WHERE LEFT (reverse, 3) = REVERSE ('190')'. (Sono annoiato, puoi dirlo?) – MatBailie

+0

Grazie ragazzi! – Jared

13

È possibile utilizzare in entrambi i casi:

SELECT RIGHT(RTRIM(columnName), 3) 

O

SELECT SUBSTRING(columnName, LEN(columnName)-2, 3) 
+0

C'è un vantaggio in un modo rispetto all'altro? Ed è necessario il RTRIM (mi sembra superfluo)? – noelicus

+0

Il lavoro può essere fatto in diversi modi e qui ho mostrato utilizzando due modi comuni. Il primo caso è più veloce della seconda. RTRIM non è obbligatorio. È usato solo per omettere ogni spazio in più sul lato destro. Grazie –

5

Perché più modi per pensarci sono sempre bene:

select reverse(substring(reverse(columnName), 1, 3)) 
+1

No, più non è sempre meglio. –

+1

Hai ragione. Avrai sempre tutti gli strumenti di cui hai bisogno per realizzare qualsiasi lavoro tu stia cercando di fare. La conoscenza non eguaglia il potere, immagino. –

+0

Non sono proprio sicuro di cosa dovrebbe significare. La soluzione che proponi è inutilmente complessa e non c'è alcuna circostanza in cui sarebbe la soluzione giusta. Quindi, è cattivo. –

1
declare @newdata varchar(30) 
set @newdata='IDS_ENUM_Change_262147_190' 
select REVERSE(substring(reverse(@newdata),0,charindex('_',reverse(@newdata)))) 

=== Spiegazione ===

ho trovato più facile da leggere scritto così:

SELECT 
    REVERSE(--4. 
     SUBSTRING(-- 3. 
      REVERSE(<field_name>), 
      0, 
      CHARINDEX(-- 2. 
       '<your char of choice>', 
       REVERSE(<field_name>) -- 1. 
      ) 
     ) 
    ) 
FROM 
    <table_name> 
  1. Reverse il testo
  2. cercare la prima occorrenza di un carattere specif (vale a dire prima occorrenza da FINE del testo). Ottiene l'indice di questo carattere
  3. Esamina nuovamente il testo invertito. cerca dall'indice 0 all'indice del tuo carattere. Questo dà la stringa che si sta cercando, ma in senso inverso
  4. invertito la stringa inversa, che darà il vostro stringa desiderata
+1

È utile fornire una spiegazione per il codice. – krsteeve

+0

I commenti di Stackoverflow.com possono accettare la formattazione con un semplice mark-up (formato mark-down). C'è aiuto disponibile. Per mostrare il segmento di codice, puoi aggiungere a ciascuna riga un prefisso con quattro spazi. – FooF

-3

se si vuole trovare specificamente le stringhe che termina con i caratteri desiderati, allora questo sarebbe aiutare ..

select * from tablename where col_name like '%190' 
+1

Questo non risponde alla domanda. L'OP vuole sapere come ottenere gli ultimi 3 caratteri, indipendentemente da cosa siano, non una stringa specifica come 190. – BradleyDotNET