2011-12-02 21 views

Odpowiedz

87
SELECT RIGHT(column, 3) 

to wszystko, czego potrzebujemy.

Możesz również wykonać LEFT() w ten sam sposób.

Należy mieć na uwadze, jeśli używa się tego w klauzuli WHERE, że RIGHT() nie może używać żadnych indeksów.

+7

Jeśli * zamierzasz * przeszukiwać duże ilości danych w ten sposób, istnieje * sposób na odzyskanie wykorzystania indeksów. Utwórz kolumnę obliczeniową, która jest łańcuchem w odwrotnej kolejności. Więc jakie były właściwe (najmniej znaczące) trzy postacie, teraz są lewymi (najbardziej znaczącymi) trzema postaciami. Następnie indeksuj tę kolumnę i poszukaj "GDZIE LEFT (odwrócone, 3) = REVERSE (" 190 ")'. (Nudzę się, czy możesz powiedzieć?) – MatBailie

+0

Dzięki wam! – Jared

13

Można użyć sposób:

SELECT RIGHT(RTRIM(columnName), 3) 

LUB

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

Czy jest przewaga w jedną stronę nad drugą? I czy RTRIM jest potrzebny (wydaje mi się zbyteczny)? – noelicus

+0

Zadanie można wykonać na kilka sposobów i tutaj pokazałem, używając dwóch wspólnych sposobów. Pierwszy przypadek jest szybszy niż drugi sposób. RTRIM nie jest obowiązkowe. Jest używany tylko po to, aby pominąć dodatkową przestrzeń po prawej stronie. Dzięki –

5

Ponieważ więcej sposobów, aby myśleć o nim są zawsze dobre: ​​

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

Nie, więcej nie zawsze jest lepiej. –

+1

Masz rację. Zawsze będziesz mieć wszystkie narzędzia potrzebne do wykonania każdej pracy, którą chcesz wykonać. Wierzę, że wiedza nie równa się mocy. –

+0

Nie jestem do końca pewien, co to ma znaczyć. Proponowane przez ciebie rozwiązanie jest niepotrzebnie skomplikowane i nie ma żadnych okoliczności, w których byłoby to właściwe rozwiązanie. Dlatego jest zły. –

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

=== wyjaśnienia ===

znalazłem to łatwiejsze do odczytania napisane tak:

SELECT 
    REVERSE(--4. 
     SUBSTRING(-- 3. 
      REVERSE(<field_name>), 
      0, 
      CHARINDEX(-- 2. 
       '<your char of choice>', 
       REVERSE(<field_name>) -- 1. 
      ) 
     ) 
    ) 
FROM 
    <table_name> 
  1. odwrócić tekst
  2. szukać pierwszego wystąpienia char określon (tj pierwsze wystąpienie OD KOŃCA tekstu). Pobiera indeks tego znaku.
  3. Znów wyświetla odwrócony tekst. przeszukuje od indeksu 0 do indeksu twojego znaku. Daje to ciąg, którego szukasz, ale w odwrotnej
  4. Odwrócona Odwrócony ciąg daje pożądany podciąg
+1

Pomocne może być wyjaśnienie kodu wraz z kodem – krsteeve

+0

Komentarze od Stackoverflow.com mogą akceptować formatowanie za pomocą prostego oznaczania (format znacznika). Dostępna jest pomoc. Aby pokazać segment kodu, możesz poprzedzić każdą linię czterema spacjami. – FooF

-3

jeśli chcesz konkretnie znaleźć ciągi który kończy pożądanych znaków wówczas Pomożesz ..

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

To nie odpowiada na pytanie. OP chce wiedzieć, jak uzyskać 3 ostatnie znaki, bez względu na to, czym są, a nie konkretny ciąg jak 190. – BradleyDotNET

Powiązane problemy