2009-04-01 47 views

Trả lời

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 

Bạn có lẽ có thể sử dụng điều này trong một 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

Cám ơn UDF này - Tôi nhận thấy rằng chọn dbo [FirstWord] ('abc def') sẽ trở lại '' Trong hầu hết các trường hợp, bạn có thể muốn trở lại 'abc' – Imageree

+0

'thiết lập. @value = ltrim (rtrim (@value)) 'có thể giải quyết vấn đề này – th1rdey3

5

Thêm sau đây trước khi tuyên bố RETURN sẽ giải quyết cho trường hợp một không gian hàng đầu đã được bao gồm trong lĩnh vực này:

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

Câu trả lời của Marc cho tôi hầu hết mọi thứ tôi cần, nhưng tôi phải đi với patIndex thay vì charIndex vì đôi khi các ký tự khác với dấu cách đánh dấu các đầu của từ dữ liệu của tôi. Ở đây tôi đang sử dụng '%[ /-]%' để tìm kiếm dấu cách, dấu gạch chéo hoặc dấu gạch ngang.

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 

Kết quả ...

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

Nên biết trước: đây là cho một tập dữ liệu nhỏ (US liên bang loại báo cáo chủng tộc); Tôi không biết điều gì sẽ xảy ra với hiệu suất khi thu nhỏ tới số lượng khổng lồ.

27

tôi muốn làm một cái gì đó như thế này mà không cần thực hiện một chức năng riêng biệt, và đã đưa ra phương pháp này đơn giản một dòng:

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

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

này sẽ trả về kết quả là "đầu tiên"

Đó là ngắn, chỉ là không mạnh mẽ, vì nó giả định chuỗi của bạn không bắt đầu với một không gian. Nó sẽ xử lý các đầu vào một từ, các đầu vào nhiều từ và các đầu vào chuỗi rỗng hoặc NULL.

+1

Yup, điều này đáp ứng nhu cầu của tôi tốt hơn. Cảm ơn Ben. – Jason

+0

Điều này thật hoàn hảo, Cảm ơn rất nhiều! – JasonR

+0

Đối với ai đó đang tìm kiếm một ví dụ chung, điều này có ý nghĩa hơn câu trả lời hàng đầu. – Brad

0

Hãy thử này:

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 

từ tbl_races

3

Enhancement của câu trả lời Ben Brandt để bù đắp ngay cả khi chuỗi bắt đầu với không gian bằng cách áp dụng LTRIM(). Đã cố gắng chỉnh sửa câu trả lời của anh ấy nhưng bị từ chối, vì vậy tôi hiện đang đăng riêng câu trả lời ở đây.

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))) 
Các vấn đề liên quan