从SQL中的字符串中提取第一个单词,其中字符串是单个单词

时间:2015-03-06 16:30:57

标签: sql substring ansi-sql

我能够使用ANSI SQL从字符串中提取第一个单词,如下所示:

SELECT SUBSTRING(name FROM 1 FOR POSITION(' ' IN name)) AS first_name

但是,如果原始字符串只有一个字长(即,如果没有空格),则返回一个空子字符串。

如何调整上述查询来解决这个问题?

提前致谢。

5 个答案:

答案 0 :(得分:1)

简单而又凌乱的解决方案 - 在最后添加一个空格:

SELECT SUBSTRING((name || ' ') FROM 1 FOR POSITION(' ' IN (name || ' '))) AS first_name

答案 1 :(得分:1)

使用条件if语句。

对于MySQL / SQL Server答案:

SELECT IF(INSTR(name, ' ') >0, LEFT(name, INSTR(name, ' ') - 1), name) AS firstname

对于Oracle:

SELECT IF(INSTRB(name, ' ', 1, 1) >0, SUBSTR(name, 1, INSTRB(name, ' ', 1, 1) - 1), name) AS firstname

答案 2 :(得分:0)

我确信有更简洁的方法可以做到这一点,但这很有效。

DECLARE @tbl TABLE (i varchar(100));

INSERT INTO @tbl ( i )
VALUES  ('hello'), ('hello space here');

SELECT *, 
    SUBSTRING(i, 0, CASE CHARINDEX(' ', i)
        WHEN 0 THEN LEN(i) + 1
        ELSE CHARINDEX(' ', i)
    END)
FROM @tbl

答案 3 :(得分:0)

将列名放在@foo

的位置
DECLARE @Foo VARCHAR(50) = 'One Two Three'

SELECT 
CASE
--For One Word
WHEN CHARINDEX(' ', @Foo, 1) = 0 THEN @Foo

--For multi word
ELSE SUBSTRING(@Foo, 1, CHARINDEX(' ', @Foo, 1) - 1)

END

答案 4 :(得分:0)

    DECLARE @test VARCHAR(50) = 'One Two Three'

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