1

スペースの前にすべてを文字列で返す必要があります。

select Substring('stack overflow', 1, CharIndex( ' ', 'stack overflow' ) - 1)

これは得られますstack

ただし、データにスペースがない場合は、文字列全体を返したいと思います:

select Substring('stackoverflow', 1, CharIndex( ' ', 'stackoverflow' ) - 1)

私はそれを返したいstackoverflow

このシナリオを処理する正しい方法は何ですか?

4

5 に答える 5

5
;WITH T(C) AS
(
SELECT 'stack overflow' UNION ALL
SELECT 'stackoverflow'
)
SELECT LEFT(C, CharIndex( ' ', C + ' ' ) - 1)
FROM T
于 2012-07-19T16:48:55.933 に答える
2

@MartinSmithの定義を借りる:

;WITH T(C) AS
(
  SELECT 'stack overflow' 
  UNION ALL
  SELECT 'stackoverflow'
)
SELECT SUBSTRING(C, 1, COALESCE(NULLIF(CHARINDEX(' ', C)-1, -1), 255))
FROM T;

そうは言っても、私はマーティンのほうが好きです。どちらも長さのチェックや CASE などの実行を回避しますが、文字列の最大長を知っていると仮定します (ここでは 255 と仮定します)。

于 2012-07-19T16:50:18.573 に答える
2

私はいつものように遅れています。ここでSQLフィドル

CREATE TABLE The_Table 
    (
     TestString varchar(50)
    );

INSERT INTO The_Table
(TestString)
VALUES
('stack overflow'),
('stackoverflow');


select 
[myResult] = case 
                when CharIndex( ' ', TestString)> 0 then Substring(TestString, 1, CharIndex( ' ', TestString ) - 1)
                when CharIndex( ' ', TestString)= 0 then TestString
                else TestString
             end
from The_Table
于 2012-07-19T17:46:44.530 に答える
1
Declare @str varchar(100)='stack overflow'
SELECT CASE WHEN CHARINDEX(' ',@str,1) > 0 then LEFT(@str,CHARINDEX(' ',@str,1)) else @str END
于 2012-07-20T05:48:01.390 に答える
1
;With T(C) AS
(
    Select 'Stack'
    Union All
    Select 'Stack OverFlow' 
)
Select 
    Case When CharIndex(' ', C) > 0 
        Then SUBSTRING(C, 0, CharIndex(' ', C))
    Else
        C
    End
From T
于 2012-07-19T17:14:08.180 に答える