Quelle est la meilleure façon d'extraire le premier mot d'une chaîne dans la requête SQL Server?Extrait le premier mot d'une chaîne dans une requête SQL Server
Répondre
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')
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))
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)
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.
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.
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
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))
DECLARE @string NVARCHAR(50)
SET @string = 'CUT STRING'
SELECT LEFT(@string,(PATINDEX('% %',@string)))
- 1. requête MySQL pour extraire le premier mot d'un champ
- 2. Comment obtenir le premier caractère d'une chaîne dans SQL?
- 3. Obtenir le schéma SQL Server via une requête SQL?
- 4. Extrait de la chaîne
- 5. Requête XML dans SQL Server
- 6. Requête SQL - Permutations de chaîne
- 7. Requête hiérarchique dans SQL Server 2005
- 8. conversion de chaîne, premier caractère supérieur de chaque mot
- 9. Est-ce une requête SQL Server efficace?
- 10. requête SQL Server - trouver d'abord dans l'ordre
- 11. Comment convertir une requête d'accès en chaîne de requête SQL Server?
- 12. « groupe par » SQL Server une requête concaténés
- 13. Comment référencer une requête SQL Server?
- 14. Analyse de chaîne xml SQL Server dans le champ varchar
- 15. sql requête dans le serveur SQL
- 16. Requête SQL efficace pour trouver le premier enregistrement associé (par date) dans une relation 1-N
- 17. Javascript extrait le numéro de la chaîne
- 18. L'assistant d'importation SQL supprime le premier zéro
- 19. Sous-requête dans SQL Server Compact Edition
- 20. Besoin d'accélérer cette requête dans SQL Server
- 21. Comment utiliser le mot-clé LIKE dans SQL?
- 22. citations Android dans une chaîne de requête SQL
- 23. Comparer une chaîne de date à datetime dans SQL Server?
- 24. SQL Server: Comment obtenir des attributs XML dans une requête?
- 25. Recherche des verrous acquis dans une requête sur SQL Server?
- 26. Problème requête de recherche dans mon Sql Server stored proc
- 27. Sql syntaxe de requête Server
- 28. Remplacer plusieurs chaînes dans une requête SQL
- 29. Comment obtenir le premier élément d'une chaîne?
- 30. SQL Server 2005 émet requête
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
'set. @value = ltrim (rtrim (@value)) 'pourrait résoudre ce problème – th1rdey3