2009-04-01 5 views

Répondre

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 

Vous pourriez peut-être utiliser dans une 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

Merci pour cette UDF - j'ai remarqué que sélectionnez dbo [FirstWord] ('abc def') retournera '' Dans la plupart des cas, vous voulez probablement revenir 'abc' – Imageree

+0

'set. @value = ltrim (rtrim (@value)) 'pourrait résoudre ce problème – th1rdey3

5

Ajouter ce qui suit avant l'instruction RETURN résoudrait pour les cas où un espace de premier plan a été inclus dans le champ:

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 réponse de Marc m'a donné la plupart de ce dont j'avais besoin, mais je devais y aller avec patIndex plutôt que charIndex parce que parfois des caractères autres que des espaces marquent les extrémités des mots de mes données. Ici, j'utilise '%[ /-]%' pour rechercher un espace, une barre oblique ou un tiret.

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 

... Résultats

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

caveat: ceci est pour un petit ensemble de données (États-Unis des catégories fédérales de rapports de course); Je ne sais pas ce qu'il adviendrait de la performance si elle était augmentée en nombre.

27

que je voulais faire quelque chose comme ça sans faire une fonction distincte, et est venu avec cette simple approche d'une ligne:

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

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

Cela renvoie le résultat « d'abord »

Il est court, pas aussi robuste, car il suppose que votre chaîne ne commence pas avec un espace. Il gère les entrées à un mot, les entrées à plusieurs mots et les entrées de chaîne vides ou NULL.

+1

Yup, cela répond mieux à mes besoins. Merci Ben. – Jason

+0

C'était parfait, merci beaucoup! – JasonR

+0

Pour quelqu'un qui cherche un exemple général, cela a plus de sens que la meilleure réponse. – Brad

0

Essayez ceci:

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

Amélioration de la réponse de Ben Brandt pour compenser, même si la chaîne commence avec l'espace en appliquant LTRIM(). J'ai essayé d'éditer sa réponse mais je l'ai rejetée, donc je la publie ici séparément.

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))) 
Questions connexes