sql >> Base de Datos >  >> NoSQL >> MongoDB

Encuentra una cadena dentro de una cadena en SQL

La mayoría de los principales DBMS nos brindan una forma de encontrar una cadena dentro de una cadena usando SQL. Con esto me refiero a usar una consulta SQL para encontrar la posición de una subcadena dentro de una cadena.

Hay varias funciones SQL que nos permiten hacer esto, incluyendo INSTR() , LOCATE() , POSITION() y CHARINDEX() . La función que utilice dependerá de su DBMS y, posiblemente, de si necesita o no especificar una posición inicial.

Oráculo

Oracle tiene un INSTR() función que devuelve la posición inicial de una subcadena dada dentro de una cadena.

Ejemplo:

SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;

Resultado:

5

Esto nos muestra que la subcadena fat comienza en la posición 5 en la cadena Big fat cat .

Es posible especificar una posición inicial pasando un tercer argumento. También podemos pasar un cuarto argumento para especificar qué ocurrencia encontrar:

SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;

Resultado:

7

En este caso comencé la búsqueda en la posición 1 y buscó la segunda ocurrencia (usando 2 como el cuarto argumento).

Oracle también tiene un INSTRB() función que hace algo similar, excepto que devuelve la posición basada en bytes.

MySQL

MySQL tiene un INSTR() función que hace algo similar a la función del mismo nombre de Oracle Database:

SELECT INSTR('Cats and dogs like to run', 'dogs');

Resultado:

10

Sin embargo, si necesita especificar una posición inicial, deberá usar LOCATE() o POSITION() :

SELECT LOCATE('cat', 'One cat jumped over the other cat', 6);

Resultado:

31

Aquí, la primera ocurrencia de cat comienza en la posición 5, pero especifiqué que la búsqueda comenzara en la posición 6. Por lo tanto, la posición de la siguiente aparición de esa cadena fue la que se devolvió.

Tenga en cuenta que, aunque la búsqueda comenzó en la posición 6, la función aún devuelve la posición de la subcadena dentro de la cadena, no desde la posición inicial.

La POSITION() función es un sinónimo de la sintaxis de dos argumentos de LOCATE() , pero con una sintaxis ligeramente diferente (POSITION() no nos permite especificar una posición inicial).

MySQL también tiene un REGEX_INSTR() función que devuelve el índice inicial de la subcadena de la cadena que coincide con la expresión regular especificada por el patrón especificado.

MariaDB

Al igual que MySQL, MariaDB también tiene un INSTR() función, así como un un LOCATE() y POSITION() función:

SELECT 
    INSTR('No news is good news', 'news') AS "INSTR",
    POSITION('news' IN 'No news is good news') AS "POSITION",
    LOCATE('news', 'No news is good news') AS "LOCATE 1",
    LOCATE('news', 'No news is good news', 5) AS "LOCATE 2";

Resultado:

+-------+----------+----------+----------+
| INSTR | POSITION | LOCATE 1 | LOCATE 2 |
+-------+----------+----------+----------+
|     4 |        4 |        4 |       17 |
+-------+----------+----------+----------+

MariaDB también tiene un REGEX_INSTR() función que devuelve el índice inicial de la subcadena de la cadena que coincide con la expresión regular especificada por el patrón especificado.

Servidor SQL

Cuando se trata de SQL Server, el CHARINDEX() función es lo que estamos buscando:

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Resultado:

17

En este caso, utilicé el tercer argumento opcional para especificar una posición inicial.

SQL Server también tiene un PATINDEX() función que busca un patrón dentro de una cadena.

SQLite

SQLite tiene un INSTR() función para satisfacer nuestras necesidades:

SELECT INSTR('Black cat', 'lack');

Resultado:

2

PostgreSQL

En PostgreSQL, necesitamos usar POSITION() función:

SELECT POSITION('Break' IN 'Bangkok Breaking');

Resultado:

9