2009-04-01 55 views

Respuesta

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 

tal vez podría utilizar esto en una 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

Gracias a este UDF - me di cuenta de que seleccione DBO [FirstWord] ('abc def') volverá '' En la mayoría de los casos es probable que desee volver 'abc' – Imageree

+0

'set. @value = ltrim (rtrim (@value)) 'podría resolver este problema – th1rdey3

5

Añadiendo lo siguiente antes de la declaración RETURN resolvería para los casos en que un espacio inicial se incluyó en el 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 respuesta de Marc me llevó la mayor parte del camino a lo que necesitaba, pero tenía que irme con patIndex en lugar de charIndex porque a veces los caracteres que no sean espacios marcan los extremos de las palabras de mis datos. Aquí estoy usando '%[ /-]%' para buscar espacio, barra o guión.

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 

resultados ...

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

Advertencia: esto es para un conjunto pequeño de datos (US federales categorías de información raza); No sé qué sucedería con el rendimiento cuando se escalara en grandes cantidades.

27

que quería hacer algo como esto sin hacer una función separada, y se acercó con este sencillo enfoque de una sola línea:

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

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

Esto devolverá el resultado "primero"

Es corto, simplemente no es tan robusto, ya que supone que su cadena no comienza con un espacio. Controlará las entradas de una palabra, las entradas de varias palabras y las cadenas vacías o las entradas NULL.

+1

Sí, esto satisface mis necesidades mejor. Gracias Ben. – Jason

+0

Esto fue perfecto, ¡muchas gracias! – JasonR

+0

Para alguien que busca un ejemplo general, esto tiene más sentido que la respuesta principal. – Brad

0

Prueba esto:

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 

de tbl_races

3

Mejora de la respuesta de Ben Brandt para compensar incluso si la cadena comienza con el espacio mediante la aplicación de LTRIM(). Intenté editar su respuesta, pero la rechacé, por lo que ahora la publico aquí por separado.

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))) 
Cuestiones relacionadas