从列的每一行中提取第二个单词

时间:2018-06-25 12:46:40

标签: mysql sql

我的数据库中有一个vendors表正在尝试,如下所示 enter image description here

当我在下面运行sql命令时

SELECT vendor_name
FROM vendors
ORDER BY vendor_name
LIMIT 10

我得到下面的输出 enter image description here

我的问题是试图从每个vendor_name中提取第二个单词,当第二个单词不存在时,应该返回一个空白单元格。

下面是我为此编写的sql查询

SELECT vendor_name,
       SUBSTRING(
           SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1),
           1,
           LOCATE( ' ', SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1) ) - 1
       ) AS second_word
FROM vendors
ORDER BY vendor_name
LIMIT 10

这是该sql查询的输出 enter image description here

如果您从上面的输出中注意到,当vendor_name中的单词多于两个时,它将返回第二个单词,而当vendor_name包含一个单词时,它将返回一个空白单元格,如下所示:预期的。

vendor_name仅包含两个单词时出现问题,例如,在American ExpressASC Signs的情况下,不是返回第二个单词而是返回一个空白单元格。

我如何更好地改善查询,以便即使vendor_name包含两个单词,它也返回第二个单词而不是空白单元格?

谢谢。

3 个答案:

答案 0 :(得分:1)

这是因为第二个单词后没有空格,如果文本在该位置结尾,locate()就没有空格。

快速攻克:在末尾添加一个空格。

 LOCATE( ' ', CONCAT(SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1), ' ') ) - 1

答案 1 :(得分:1)

 SELECT vendor_name  , substr(vendor_name , instr(vendor_name, " ") ,
 case when LOCATE (' ', vendor_name,instr(vendor_name, " ") ) > 0 then  LOCATE (' ', 
vendor_name,instr(vendor_name, " ") ) else CHAR_LENGTH (vendor_name) end )
  from vendors ;

答案 2 :(得分:1)

我从@stick bit和@kiran gadhe那里获得了提示,我想出了这个sql查询,它工作得很好

SELECT vendor_name,
       CASE
           WHEN INSTR( vendor_name, ' ' ) = 0
           THEN
               ''
           ELSE
               SUBSTRING(
                   SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1),
                   1,
                   LOCATE( ' ', CONCAT(SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1), ' ') ) - 1
               )
       END AS second_word
FROM vendors
ORDER BY vendor_name
LIMIT 10