MYSQL 获取子串

问题描述

我正在尝试动态获取子字符串并对其进行分组。因此,如果我的 uri 列包含以下记录:/uri1/uri2/somelongword/someotherlongword 我希望将所有内容都设置为第二个分隔符,即最多第二个 / 并对其进行计数。我正在使用这个查询,但显然它是静态剪切字符串(第一个后 6 个字母)。

SELECT substr(uri,1,6) as URI,COUNT(*) as COUNTER
FROM staging
GROUP BY substr(uri,6)
ORDER BY COUNTER DESC

我怎样才能做到这一点?

解决方法

您可以组合使用 SUBSTRING()POSITION()

架构:

CREATE TABLE Table1
    (`uri` varchar(10))
;
    
INSERT INTO Table1
    (`uri`)
VALUES
    ('some/text'),('some/text1'),('some/text2'),('aa/bb'),('aa/cc'),('bb/cc')
;

查询

SELECT 
  SUBSTRING(uri,1,POSITION('/' IN uri)-1),COUNT(*) 
FROM Table1 
GROUP BY SUBSTRING(uri,POSITION('/' IN uri)-1);

http://sqlfiddle.com/#!9/293dd3/3/0

编辑:在这里我找到了 amazon athena 文档:https://docs.aws.amazon.com/athena/latest/ug/presto-functions.html,这里是字符串函数文档:https://prestodb.io/docs/0.217/functions/string.html

我上面的答案仍然有效,但您可能需要将 SUBSTRING 更改为 SUBSTR

编辑 2:似乎在亚马逊雅典娜中有一个特殊的功能可以实现这一点,称为 SPLIT_PART()

查询:

SELECT SPLIT_PART(uri,'/',1),COUNT(*) FROM tbl GROUP BY SPLIT_PART(uri,1)

来自文档:

split_part(string,delimiter,index) → varchar
Splits string on delimiter and returns the field index. Field indexes start with 1. If the index is larger than than the number of fields,then null is returned.