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

rqcrx0a6  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(416)

我有一个 vendors 我正在试验的数据库中的表,如下所示

当我运行下面的sql命令时

SELECT vendor_name
FROM vendors
ORDER BY vendor_name
LIMIT 10

我得到下面的输出

我的问题是我试图从每个词中提取第二个词 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查询的输出

如果您从上面的输出中注意到 vendor_name 如果两个以上,则返回第二个单词正好,当 vendor_name 包含一个单词它会按预期返回一个空白单元格。
问题来的时候 vendor_name 只包含两个单词,而不是返回第二个单词,它返回一个空白单元格,例如在 American Express 以及 ASC Signs .
如何更好地改进查询,以便即使 vendor_name 是否包含两个单词,是否返回第二个单词而不是空白单元格?
谢谢您。

bd1hkmkf

bd1hkmkf1#

我从@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
tez616oj

tez616oj2#

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 ;
dsekswqp

dsekswqp3#

这是因为在第二个单词后面没有空格,如果文本在那里结束,那么 locate() 找不到地方。
快速破解:在结尾加一个空格。

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

相关问题