Какой лучший способ извлечь первое слово строки в запросе sql-сервера?
Извлечь первое слово строки в запросе SQL Server
Ответ 1
SELECT CASE CHARINDEX(' ', @Foo, 1)
WHEN 0 THEN @Foo -- empty or single word
ELSE SUBSTRING(@Foo, 1, CHARINDEX(' ', @Foo, 1) - 1) -- multi-word
END
Возможно, вы можете использовать это в 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')
Ответ 2
Я хотел сделать что-то вроде этого, не делая отдельной функции, и придумал этот простой однострочный подход:
DECLARE @test NVARCHAR(255)
SET @test = 'First Second'
SELECT SUBSTRING(@test,1,(CHARINDEX(' ',@test + ' ')-1))
Это вернет результат "Первый"
Это короткий, просто не такой надежный, поскольку он предполагает, что ваша строка не начинается с пробела. Он будет обрабатывать однословные входы, многословные входы и пустые строки или NULL-входы.
Ответ 3
Добавление следующего до того, как оператор RETURN
будет разрешен для случаев, когда в поле было включено ведущее пространство:
SET @Value = LTRIM(RTRIM(@Value))
Ответ 4
Усиление ответа Бена Брандта компенсировать, даже если строка начинается с пробела, применяя LTRIM(). Пытался отредактировать его ответ, но отклонил, так что теперь я размещаю его здесь отдельно.
DECLARE @test NVARCHAR(255)
SET @test = 'First Second'
SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))
Ответ 5
Ответ Marc дал мне большую часть того, что мне было нужно, но мне пришлось идти с patIndex
, а не charIndex
, потому что иногда символы, отличные от пробелов, помечены концами моих слов данных. Здесь я использую '%[ /-]%'
для поиска пробела, косой черты или тире.
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
Результаты...
race_id race_description race_abbreviation
------- ------------------------- -----------------
1 White White
2 Black or African American Black
3 Hispanic/Latino Hispanic
Предостережение: это для небольшого набора данных (категории федеральной гонки США); Я не знаю, что произойдет с производительностью при масштабировании до огромных чисел.
Ответ 6
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)
Ответ 7
Попробуйте следующее:
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
из tbl_races
Ответ 8
DECLARE @string NVARCHAR(50)
SET @string = 'CUT STRING'
SELECT LEFT(@string,(PATINDEX('% %',@string)))