Jak uzyskać pierwszy znak ciągu w SQL?


262

Mam kolumnę SQL o długości 6. Teraz chcę pobrać tylko pierwszy znak tej kolumny. Czy jest w tym celu jakaś funkcja ciągu w SQL?

Odpowiedzi:


436

LEFT(colName, 1)też to zrobi. Jest to równoważne z SUBSTRING(colName, 1, 1).

Lubię LEFT, ponieważ uważam, że jest trochę czystszy, ale tak naprawdę nie ma żadnej różnicy.


2
Nie wiem o SQL Server, ale logicznie serwer bazy danych może być w stanie zoptymalizować LEWY lepiej niż SUBSTRING, gdy używa indeksu.
thomasrutter

19
@thomasrutter, Patrząc na plan wykonania, SQL Server (co najmniej 2008R2) przekłada się wewnętrznie LEFT(colName, length)do SUBSTRING(colName, 1, length). Więc nie ma tu żadnych optymalizacji , to tylko preferencja.
Alexander Abakumov

44

Wolę:

SUBSTRING (my_column, 1, 1)

ponieważ jest to standardowa składnia SQL-92 i dlatego jest bardziej przenośna.


Ściśle mówiąc, byłaby to wersja standardowa

SUBSTRING (my_column FROM 1 FOR 1)

Chodzi o to, że przejście od jednego do drugiego, a więc do dowolnej podobnej odmiany dostawcy, jest banalne.

ps Niedawno wskazano mi, że funkcje w standardowym języku SQL są celowo przeciwne, ponieważ listy parametrów nie są konwencjonalnymi komalistami, aby ułatwić ich identyfikację ze standardu!


1
Dziękujemy, LEFT (str, n) nie jest obsługiwany przez wiele formatów (w tym tego, którego używam).
GreySage,

1
Dlaczego indeks zaczyna się od 1, a nie od 0? Zwraca ten sam wynik: SUBSTRING (moja_kolumna, 1, 1) = SUBSTRING (moja_kolumna, 0, 2). Co to jest w pozycji 0?
FrenkyB

19

SUBSTRING ( MyColumn, 1 , 1 )dla pierwszej postaci i SUBSTRING ( MyColumn, 1 , 2 )pierwszych dwóch.



13

Można to łatwo osiągnąć w następujący sposób

DECLARE @SomeString NVARCHAR(20) = 'This is some string'
DECLARE @Result NVARCHAR(20)

Zarówno

SET @Result = SUBSTRING(@SomeString, 2, 3)
SELECT @Result

@Result = his

lub

SET @Result = LEFT(@SomeString, 6)
SELECT @Result

@Result = This i


3

WEJŚCIE

STRMIDDLENAME
--------------
Aravind Chaterjee
Shivakumar
Robin Van Parsee

SELECT STRMIDDLENAME, 
CASE WHEN INSTR(STRMIDDLENAME,' ',1,2) != 0 THEN SUBSTR(STRMIDDLENAME,1,1) || SUBSTR(STRMIDDLENAME,INSTR(STRMIDDLENAME,' ',1,1)+1,1)||
SUBSTR(STRMIDDLENAME,INSTR(STRMIDDLENAME,' ',1,2)+1,1)
WHEN INSTR(STRMIDDLENAME,' ',1,1) != 0 THEN SUBSTR(STRMIDDLENAME,1,1) || SUBSTR(STRMIDDLENAME,INSTR(STRMIDDLENAME,' ',1,1)+1,1)
ELSE SUBSTR(STRMIDDLENAME,1,1)
END AS FIRSTLETTERS
FROM Dual;

OUTPUT
STRMIDDLENAME                    FIRSTLETTERS
---------                        -----------------
Aravind Chaterjee                AC           
Shivakumar                       S
Robin Van Parsee                 RVP

2

Jeśli przeszukujesz pierwszy znak ciągu w ciągu Sql

SELECT CHARINDEX('char', 'my char')

=> return 4

2

Wybierz Pierwsze dwa znaki w wybranym polu za pomocą Left(string,Number of Char in int)

SELECT LEFT(FName, 2) AS FirstName FROM dbo.NameMaster
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.