2009-04-01 4 views

Antwort

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 

Sie könnten vielleicht diese in einem UDF verwenden:

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

Vielen Dank für diese UDF - Ich bemerkte, dass wählen dbo [Firstword] ('abc def') kehrt '' In den meisten Fällen werden Sie wahrscheinlich zurückkehren wollen 'abc' – Imageree

+0

'gesetzt. @value = ltrim (rtrim (@value)) 'könnte dieses Problem lösen – th1rdey3

5

Hinzufügen der folgenden bevor die RETURN Erklärung für die Fälle lösen würde, wo ein führender Platz im Feld aufgenommen wurde:

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

Marcs Antwort brachte mir den größten Teil davon, was ich brauchte, aber ich musste mitgehenstatt charIndex weil manchmal andere Zeichen als Leerzeichen die Enden der Wörter meiner Daten markieren. Hier verwende ich '%[ /-]%', um nach Leerzeichen, Schrägstrich oder Bindestrich zu suchen.

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 

Ergebnisse ...

race_id race_description   race_abbreviation 
------- ------------------------- ----------------- 
1  White      White 
2  Black or African American Black 
3  Hispanic/Latino   Hispanic 

Caveat: dies für einen kleinen Datensatz ist (US-Bundes Rennen Meldekategorien); Ich weiß nicht, was mit der Leistung passieren würde, wenn man auf große Zahlen skaliert.

27

Ich wollte, ohne eine separate Funktion, so etwas zu tun, und kam mit diesem einfachen einzeiligen Ansatz bis:

DECLARE @test NVARCHAR(255) 
SET @test = 'First Second' 

SELECT SUBSTRING(@test,1,(CHARINDEX(' ',@test + ' ')-1)) 

Dies würde das Ergebnis zurückgeben „First“

es kurz ist, nur nicht so robust, da es davon ausgeht, dass Ihre Zeichenfolge nicht mit einem Leerzeichen beginnt. Es wird Ein-Wort-Eingaben, Mehrwort-Eingaben und leere Zeichenfolge oder NULL-Eingaben verarbeiten.

+1

Yup, das erfüllt meine Bedürfnisse besser. Danke Ben. – Jason

+0

Das war perfekt, vielen Dank! – JasonR

+0

Für jemanden, der ein allgemeines Beispiel finden möchte, ist dies sinnvoller als die oberste Antwort. – Brad

0

Try This:

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 

von tbl_races

3

Verbesserung der Antwort Ben Brandts sogar zu kompensieren, wenn die Zeichenfolge mit Platz beginnt mit LTRIM Anwendung(). Versucht, seine Antwort zu bearbeiten, aber abgelehnt, also poste ich es jetzt hier separat.

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))) 
Verwandte Themen