2009-04-01 6 views

Odpowiedz

55
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') 
+0

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

+0

'set. @value = ltrim (rtrim (@value)) 'może rozwiązać ten problem – th1rdey3

5

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)) 
0
 
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) 

1

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.

27

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.

+1

Tak, to lepiej spełnia moje potrzeby. Dzięki Ben. – Jason

+0

To było idealne, wielkie dzięki! – JasonR

+0

Dla kogoś, kto szuka ogólnego przykładu, ma to więcej sensu niż najlepsza odpowiedź. – Brad

0

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

3

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)) 
0
DECLARE @string NVARCHAR(50) 

SET @string = 'CUT STRING' 

SELECT LEFT(@string,(PATINDEX('% %',@string)))