如何在MySQL中压缩表值函数的结果?

时间:2015-04-22 03:17:13

标签: mysql function flatten

我正在使用MySQL,我有一个函数可以接受来自表行的col数据,并返回一个表值函数。例如,像这样的函数:

CREATE FUNCTION [dbo].[wordlongerthan4](
 @input text
) returns @result table(
 pos int,
 word varchar,
)

将返回长于4char的单词及其位置。

我想做一个类似下面的SQL

select t.name,wordlongerthan4(t.content) from sometable as t;

在桌子上

------------------------------------------------------------------
| id       | name        | content                               |
------------------------------------------------------------------
|1         | my1         | i love something and nothing          |
|2         | my2         | It is a sunny day today               |

得到结果:

|name   | pos | word           |
--------------------------------
|my1    |8    |something       |
|my1    |22   |nothing         |
|my2    |9    |sunny           |
|my2    |20   |today           |

我怎么能写sql?(函数wordlongerthan4已经存在,我只需要sql!)

2 个答案:

答案 0 :(得分:0)

你在谈论的是:

  1. 循环浏览每条记录并提取内容。
  2. 通过分隔符(在这种情况下为空格)拆分内容。
  3. 测量每个部分的长度
  4. 将该部件添加到成功结果的数组中,其长度为< ñ (4)。
  5. 返回部分,以及原始的id和名称 记录它最初来自。
  6. 就像ajreal所说,这是最好在应用程序层完成的事情,大概是在你的php / java /之内。

    目前没有内置的字符串爆炸/分割功能,但这里的这个问题可能有用:Equivalent of explode() to work with strings in mysql

答案 1 :(得分:0)

您可以(ab)使用MySQL 8中的新JSON_TABLE函数执行此操作:

set @input = 'i love something and nothing';

SELECT Value, LENGTH(Value) as Length, LOCATE(Value, @delimited) as pos
     FROM
       JSON_TABLE(
         CONCAT('["', REPLACE(@delimited, ' ', '", "'), '"]'),
         "$[*]"
         COLUMNS(
           Value varchar(50) PATH "$"
         )
       ) data
where LENGTH(Value) > 4;