如何在SQL中按句点将文本拆分为列?

时间:2019-01-04 19:43:24

标签: sql delimited-text

我在下面有一列以这种格式返回数据。我正在尝试编写查询,以便它仅返回水果名称(即苹果,梨,桃子)。

text.apple.food.day1_2018.store
text.pear.food.day23_2018.store
text.peach.food.day4_2018.store
text.apple.food.day15_2018.store

这可能吗?我可以执行文本到列的排序功能,然后仅提取水果名称吗?谢谢!

3 个答案:

答案 0 :(得分:1)

您可以通过以下两种方法进行处理。我建议以任何您正在使用的SQL语言使用String函数,以获取第一个“”的位置。字符,第二个“。”字符,并使用子字符串中的字符拉回中间部分。在T-SQL(MSSQL)中,看起来像这样。

Declare @TextTable Table 
( TxtColumn VarChar(50))
Insert Into @TextTable 
Values
('text.apple.food.day1_2018.store'),
('text.pear.food.day23_2018.store'),
('text.peach.food.day4_2018.store'),
('text.apple.food.day15_2018.store')



Select SUBSTRING(t.TxtColumn, CHARINDEX('.',t.TxtColumn)+1, CharIndex('.',t.txtColumn,CHARINDEX('.',t.TxtColumn)+1) - (CHARINDEX('.',t.TxtColumn)+1))
From @TextTable t

答案 1 :(得分:0)

在Oracle中,我将使用正则表达式来获取字符串中的第二个元素。具体来说,它将在后面跟有文字句号的任何字符的集合的一行上返回第二个实例。此示例使用称为CTE(公用表表达式或WITH子句)的内容来设置逻辑上具有数据集的临时表。实际上,您将从底部的SELECT开始,将您的表替换为tbl,将您的列替换为str。始终将值放入将测试所有条件的测试数据集中。永远期待意外! NULL,空格,带有特殊字符的值等。尤其是当数据来自键盘用户时。

您应该能够将此逻辑应用于正在使用的任何RDBMS。祝你好运!

with tbl(str) as (
  select 'text.apple.food.day1_2018.store' from dual union all
  select 'text.pear.food.day23_2018.store' from dual union all
  select 'text.peach.food.day4_2018.store' from dual union all
  select 'text..food.day15_2018.store' from dual union all
  select '.banana.food.day15_2018.store' from dual union all
  select 'text.apple.food.day15_2018.store' from dual 
)
select regexp_substr(str, '(.*?)(\.)', 1, 2, NULL, 1)
from tbl;

答案 2 :(得分:0)

如果您使用的是Postgres这样的现代数据库,则split_part function可能可用。如果是这样,您可以尝试:

with your_values as
(
    select 'text.apple.food.day1_2018.store' as value
)
select
    split_part(value, '.', 2) as fruit
from
    your_values

结果:

apple