Jaki jest najlepszy sposób wyodrębnienia pierwszego słowa ciągu znaków w zapytaniu serwera sql?Wyodrębnij pierwsze słowo ciągu znaków w zapytaniu do serwera SQL
Odpowiedz
SELECT CASE CHARINDEX(' ', @Foo, 1)
WHEN 0 THEN @Foo -- empty or single word
ELSE SUBSTRING(@Foo, 1, CHARINDEX(' ', @Foo, 1) - 1) -- multi-word
END
Można być może to wykorzystać w UDF:
CREATE FUNCTION [dbo].[FirstWord] (@value varchar(max))
RETURNS varchar(max)
AS
BEGIN
RETURN CASE CHARINDEX(' ', @value, 1)
WHEN 0 THEN @value
ELSE SUBSTRING(@value, 1, CHARINDEX(' ', @value, 1) - 1) END
END
GO -- test:
SELECT dbo.FirstWord(NULL)
SELECT dbo.FirstWord('')
SELECT dbo.FirstWord('abc')
SELECT dbo.FirstWord('abc def')
SELECT dbo.FirstWord('abc def ghi')
Dodanie następujących przed oświadczenie RETURN
rozwiązałoby dla przypadków, w których wiodącą przestrzeń została zawarta w polu:
SET @Value = LTRIM(RTRIM(@Value))
A slight tweak to the function returns the next word from a start point in the entry CREATE FUNCTION [dbo].[GetWord] ( @value varchar(max) , @startLocation int ) RETURNS varchar(max) AS BEGIN SET @value = LTRIM(RTRIM(@Value)) SELECT @startLocation = CASE WHEN @startLocation > Len(@value) THEN LEN(@value) ELSE @startLocation END SELECT @value = CASE WHEN @startLocation > 1 THEN LTRIM(RTRIM(RIGHT(@value, LEN(@value) - @startLocation))) ELSE @value END RETURN CASE CHARINDEX(' ', @value, 1) WHEN 0 THEN @value ELSE SUBSTRING(@value, 1, CHARINDEX(' ', @value, 1) - 1) END END GO SELECT dbo.GetWord(NULL, 1) SELECT dbo.GetWord('', 1) SELECT dbo.GetWord('abc', 1) SELECT dbo.GetWord('abc def', 4) SELECT dbo.GetWord('abc def ghi', 20)
Odpowiedź Marca doprowadziła mnie do tego, czego potrzebowałem, ale musiałem przejść z patIndex
zamiast charIndex
, ponieważ czasami znaki inne niż spacje oznaczają końcówki słów moich danych. Tutaj używam '%[ /-]%'
, aby wyszukać spację, ukośnik lub kreskę.
Select race_id, race_description
, Case patIndex ('%[ /-]%', LTrim (race_description))
When 0 Then LTrim (race_description)
Else substring (LTrim (race_description), 1, patIndex ('%[ /-]%', LTrim (race_description)) - 1)
End race_abbreviation
from tbl_races
Wyniki ...
race_id race_description race_abbreviation
------- ------------------------- -----------------
1 White White
2 Black or African American Black
3 Hispanic/Latino Hispanic
Zastrzeżenie: to jest dla małego zbioru danych (US Federal kategorii sprawozdawczości wyścigu); Nie wiem, co by się stało z wydajnością przy skalowaniu do dużych liczb.
chciałem zrobić coś takiego bez osobnej funkcji i wymyślił tego prostego podejścia jedną linię:
DECLARE @test NVARCHAR(255)
SET @test = 'First Second'
SELECT SUBSTRING(@test,1,(CHARINDEX(' ',@test + ' ')-1))
byłby to powrót wynik „pierwszy”
To krótkie, nie jest tak solidny, ponieważ zakłada, że twój ciąg nie zaczyna się od spacji. Będzie obsługiwać jedno słowo, wiele słów i puste ciągi lub wartości NULL.
Spróbuj to:
Select race_id, race_description
, Case patIndex ('%[ /-]%', LTrim (race_description))
When 0 Then LTrim (race_description)
Else substring (LTrim (race_description), 1, patIndex ('%[ /-]%', LTrim (race_description)) - 1)
End race_abbreviation
z tbl_races
Enhancement odpowiedzi Ben Brandta, aby zrekompensować nawet jeśli ciąg rozpoczyna się od miejsca, stosując LTRIM(). Próbowałem edytować odpowiedź, ale ją odrzucono, dlatego teraz publikuję ją osobno.
DECLARE @test NVARCHAR(255)
SET @test = 'First Second'
SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))
DECLARE @string NVARCHAR(50)
SET @string = 'CUT STRING'
SELECT LEFT(@string,(PATINDEX('% %',@string)))
Dzięki za tym UDF - Zauważyłem, że wybierz dbo [FirstWord] ('def abc') powróci '' W większości przypadków prawdopodobnie chcesz, aby powrócić 'abc' – Imageree
'set. @value = ltrim (rtrim (@value)) 'może rozwiązać ten problem – th1rdey3