【发布时间】:2009-04-01 22:34:12
【问题描述】:
在 sql server 查询中提取字符串的第一个单词的最佳方法是什么?
【问题讨论】:
标签: tsql
在 sql server 查询中提取字符串的第一个单词的最佳方法是什么?
【问题讨论】:
标签: tsql
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')
【讨论】:
我想在不制作单独函数的情况下做这样的事情,并想出了这个简单的单行方法:
DECLARE @test NVARCHAR(255)
SET @test = 'First Second'
SELECT SUBSTRING(@test,1,(CHARINDEX(' ',@test + ' ')-1))
这将返回结果“First”
它很短,只是没有那么健壮,因为它假设您的字符串不以空格开头。它将处理单字输入、多字输入和空字符串或 NULL 输入。
【讨论】:
SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))
通过应用 LTRIM() 增强 Ben Brandt 的答案以补偿即使字符串以空格开头。试图编辑他的答案但被拒绝,所以我现在将其单独发布在这里。
DECLARE @test NVARCHAR(255)
SET @test = 'First Second'
SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))
【讨论】:
在RETURN 语句之前添加以下内容将解决字段中包含前导空格的情况:
SET @Value = LTRIM(RTRIM(@Value))
【讨论】:
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
警告:这是针对小型数据集(美国联邦种族报告类别);我不知道当规模扩大到巨大数量时性能会发生什么变化。
【讨论】:
DECLARE @string NVARCHAR(50)
SET @string = 'CUT STRING'
SELECT LEFT(@string,(PATINDEX('% %',@string)))
【讨论】:
从指定字段中提取第一个单词:
SELECT SUBSTRING(field1, 1, CHARINDEX(' ', field1)) FROM table1;
从指定字段中提取第二个和后续单词:
SELECT SUBSTRING(field1, CHARINDEX(' ', field1)+1, LEN (field1)-CHARINDEX(' ', field1)) FROM table1;
【讨论】:
【讨论】:
试试这个:
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
【讨论】: