Original post: http://anothermysqldba.blogspot.com/2014/12/findparse-string-from-within-string.html
Então, eu notei algumas perguntas diferentes e posts sobre a análise de um seqüência de outra cadeia recentemente. Enquanto algumas soluções incluíram a criação de novas funções e etc, também pode ser realizado dentro de um único comando, em alguns casos.
Por exemplo, digamos que nós estamos olhando para tirar o domínio de uma URL. Vou tentar entrar em detalhes a respeito de porque e como isso funciona.
Temos a tabela a seguir.
A meta para este exemplo é desconsiderar o http: // ou https: // e nada depois do .com. Portanto, usar locate para encontrar os locais.
A referência .com é fácil, uma vez que é constante para que possamos começar com isso.
OK assim que nós queremos remover o /, que local é esse?
Isso nos dá a nossa posição final, eu só colocar os aliases de campo para tornar os resultados mais fáceis de seguir.
Agora classificando para fora depois de HTTP e HTTPS é realmente muito fácil, bem como ambos têm: // depois deles, por isso, só precisa da localização do segundo / na seqüência.
Essas consultas são apenas mostrando o que os diferentes aspectos da consulta final vai fazer. Por isso, vamos colocar tudo isso junto.
Agora espero que o ajuda a ser capaz de analisar o que quer que você precisa. Este exemplo está limitado a um URL. Mas uma vez que alguns exemplos de funções já aqui é o meu exemplo de uma função que você pode usar para analisar o que você precisa.
Puxe um sobrenome de um campo de nome completo:
Puxe o primeiro nome
Concedido com os exemplos de nomes que você precisa saber os valores delimitador. Mas este é apenas um exemplo, você pode construir.
Então, eu notei algumas perguntas diferentes e posts sobre a análise de um seqüência de outra cadeia recentemente. Enquanto algumas soluções incluíram a criação de novas funções e etc, também pode ser realizado dentro de um único comando, em alguns casos.
Por exemplo, digamos que nós estamos olhando para tirar o domínio de uma URL. Vou tentar entrar em detalhes a respeito de porque e como isso funciona.
Temos a tabela a seguir.
CREATE TABLE `parse_example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`urldemo` varchar(150) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
+----+----------------------------+
| id | urldemo |
+----+----------------------------+
| 1 | http://www.mysql.com/ |
| 2 | http://www.percona.com/ |
| 3 | https://tools.percona.com/ |
| 4 | https://mariadb.com/ |
| 5 | http://planet.mysql.com/ |
| 6 | http://dev.mysql.com/doc/ |
+----+----------------------------+
A meta para este exemplo é desconsiderar o http: // ou https: // e nada depois do .com. Portanto, usar locate para encontrar os locais.
A referência .com é fácil, uma vez que é constante para que possamos começar com isso.
SELECT LOCATE('.com', urldemo), urldemo FROM parse_example;
+-------------------------+----------------------------+
| LOCATE('.com', urldemo) | urldemo |
+-------------------------+----------------------------+
| 17 | http://www.mysql.com/ |
| 19 | http://www.percona.com/ |
| 22 | https://tools.percona.com/ |
| 16 | https://mariadb.com/ |
| 20 | http://planet.mysql.com/ |
| 17 | http://dev.mysql.com/doc/ |
+-------------------------+----------------------------+
OK assim que nós queremos remover o /, que local é esse?
SELECT LOCATE('.com', urldemo) as start, LOCATE('.com', urldemo) +4 as end, SUBSTRING(urldemo FROM LOCATE('.com', urldemo) + 4 ) AS resulting , urldemo FROM parse_example;
+-------+-----+-----------+----------------------------+
| start | end | resulting | urldemo |
+-------+-----+-----------+----------------------------+
| 17 | 21 | / | http://www.mysql.com/ |
| 19 | 23 | / | http://www.percona.com/ |
| 22 | 26 | / | https://tools.percona.com/ |
| 16 | 20 | / | https://mariadb.com/ |
| 20 | 24 | / | http://planet.mysql.com/ |
| 17 | 21 | /doc/ | http://dev.mysql.com/doc/ |
+-------+-----+-----------+----------------------------+
Isso nos dá a nossa posição final, eu só colocar os aliases de campo para tornar os resultados mais fáceis de seguir.
Agora classificando para fora depois de HTTP e HTTPS é realmente muito fácil, bem como ambos têm: // depois deles, por isso, só precisa da localização do segundo / na seqüência.
SELECT LOCATE('/', urldemo) as first, LOCATE('/', urldemo) +1 as second, urldemo
FROM parse_example;
+-------+--------+----------------------------+
| first | second | urldemo |
+-------+--------+----------------------------+
| 6 | 7 | http://www.mysql.com/ |
| 6 | 7 | http://www.percona.com/ |
| 7 | 8 | https://tools.percona.com/ |
| 7 | 8 | https://mariadb.com/ |
| 6 | 7 | http://planet.mysql.com/ |
| 6 | 7 | http://dev.mysql.com/doc/ |
+-------+--------+----------------------------+
Essas consultas são apenas mostrando o que os diferentes aspectos da consulta final vai fazer. Por isso, vamos colocar tudo isso junto.
SELECT
TRIM(TRAILING SUBSTRING(urldemo FROM LOCATE('.com', urldemo) + 4 )
FROM SUBSTRING(urldemo FROM LOCATE('/', urldemo) + 2 ) ) AS parsed_domain ,
urldemo as original_url
FROM parse_example;
+-------------------+----------------------------+
| parsed_domain | original_url |
+-------------------+----------------------------+
| www.mysql.com | http://www.mysql.com/ |
| www.percona.com | http://www.percona.com/ |
| tools.percona.com | https://tools.percona.com/ |
| mariadb.com | https://mariadb.com/ |
| planet.mysql.com | http://planet.mysql.com/ |
| dev.mysql.com | http://dev.mysql.com/doc/ |
+-------------------+----------------------------+
Agora espero que o ajuda a ser capaz de analisar o que quer que você precisa. Este exemplo está limitado a um URL. Mas uma vez que alguns exemplos de funções já aqui é o meu exemplo de uma função que você pode usar para analisar o que você precisa.
CREATE FUNCTION PARSE_STRING(delimiterA VARCHAR(50), delimiterB VARCHAR(50), passed_string VARCHAR(255) )
RETURNS VARCHAR(255) DETERMINISTIC
RETURN
TRIM(TRAILING SUBSTRING(passed_string FROM LOCATE(delimiterB, passed_string) )
FROM SUBSTRING(passed_string FROM LOCATE(delimiterA, passed_string) + CHAR_LENGTH(delimiterA) ) ) ;
SELECT PARSE_STRING('//','.com', urldemo) FROM parse_example;
+------------------------------------+
| PARSE_STRING('//','.com', urldemo) |
+------------------------------------+
| www.mysql |
| www.percona |
| tools.percona |
| mariadb |
| planet.mysql |
| dev.mysql |
+------------------------------------+
Puxe um sobrenome de um campo de nome completo:
SELECT PARSE_STRING('John ','', 'John Smith') ;
+----------------------------------------+
| PARSE_STRING('John ','', 'John Smith') |
+----------------------------------------+
| Smith |
+----------------------------------------+
Puxe o primeiro nome
SELECT PARSE_STRING('',' Smith', 'John Smith') ;
+-----------------------------------------+
| PARSE_STRING('',' Smith', 'John Smith') |
+-----------------------------------------+
| John |
+-----------------------------------------+
Concedido com os exemplos de nomes que você precisa saber os valores delimitador. Mas este é apenas um exemplo, você pode construir.