2009-04-01 30 views

risposta

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 

Si potrebbe forse usare questo in un 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

Grazie per questo UDF - ho notato che selezionare dbo [FirstWord] ('abc def') restituirà '' Nella maggior parte dei casi probabilmente avrete bisogno di tornare 'abc' – Imageree

+0

'set. @value = ltrim (rtrim (@value)) 'potrebbe risolvere questo problema – th1rdey3

5

L'aggiunta dei seguenti prima dell'istruzione RETURN risolverebbe i casi in cui uno spazio iniziale è stato incluso nel campo:

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

La risposta di Marc mi ha dato la maggior parte del modo in cui avevo bisogno, ma dovevo andare con patIndex anziché charIndex perché a volte i caratteri diversi dagli spazi segnano le estremità delle parole dei miei dati. Qui sto usando '%[ /-]%' per cercare spazio, barra o trattino.

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 

Risultati ...

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

Avvertenza: questo è per un piccolo insieme di dati (US federali categorie di segnalazione di gara); Non so cosa succederebbe alle prestazioni se ridimensionato a numeri enormi.

27

ho voluto fare qualcosa di simile senza fare una funzione separata, e si avvicinò con questo semplice approccio one-line:

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

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

Ciò restituirà il risultato "First"

E 'breve, semplicemente non così robusto, dato che presuppone che la tua stringa non inizi con uno spazio. Gestirà ingressi di una sola parola, ingressi di più parole e stringa vuota o ingressi NULL.

+1

Sì, questo soddisfa meglio le mie esigenze. Grazie Ben. – Jason

+0

Questo è stato perfetto, grazie mille! – JasonR

+0

Per qualcuno che cerca di trovare un esempio generale, questo ha più senso della risposta principale. – Brad

0

provate questo:

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 

da tbl_races

3

Miglioramento della risposta di Ben Brandt per compensare, anche se la stringa inizia con lo spazio mediante l'applicazione di LTRIM(). Ho cercato di modificare la sua risposta ma ho rifiutato, quindi ora lo sto postando separatamente.

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))) 
Problemi correlati