当我在下面运行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
如果您从上面的输出中注意到,当vendor_name
中的单词多于两个时,它将返回第二个单词,而当vendor_name
包含一个单词时,它将返回一个空白单元格,如下所示:预期的。
当vendor_name
仅包含两个单词时出现问题,例如,在American Express
和ASC Signs
的情况下,不是返回第二个单词而是返回一个空白单元格。
我如何更好地改善查询,以便即使vendor_name
包含两个单词,它也返回第二个单词而不是空白单元格?
谢谢。
答案 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