Uso de Like en consultas

En este post, abordo un tema sencillo pero muy importante acerca del uso del like en las consultas que se hacen a la base de datos.

Primero, veámos un poco el cómo usarlo. El formato implica la comparación de un campo contra una serie de caracteres de acuerdo a un patrón. Este patrón puede ser delimitado por el caracter % para denotar una serie de caracteres que no conocemos en dicho patrón y un _ para cuando es un solo caracter el que se desconoce, esto se logra poniendo ambos caracteres en la posición del texto donde se desconoce la posición. Por ejemplo:

SQL> select *
  2  from   tipo
  3  where  programa = 'CLIENTE';
CLAVE DESCRIPCION                    PROGRAMA
----- ------------------------------ ----------
CAAA  CLIENTE EXCELENTE              CLIENTE
CAA   CLIENTE MUY BUENO              CLIENTE
CA    CLIENTE BUENO                  CLIENTE
CB    CLIENTE REGULAR                CLIENTE
CC    CLIENTE MALO                   CLIENTE
SQL> select *
  2  from   tipo
  3  where  clave like 'C_AA';
CLAVE DESCRIPCION                    PROGRAMA
----- ------------------------------ ----------
CAAA  CLIENTE EXCELENTE              CLIENTE
SQL> select *
  2  from   tipo
  3  where  descripcion like 'C_IENTE%';
CLAVE DESCRIPCION                    PROGRAMA
----- ------------------------------ ----------
CA    CLIENTE BUENO                  CLIENTE
CAAA  CLIENTE EXCELENTE              CLIENTE
CC    CLIENTE MALO                   CLIENTE
CAA   CLIENTE MUY BUENO              CLIENTE
CB    CLIENTE REGULAR                CLIENTE
SQL> select *
  2  from   tipo
  3  where  clave like 'CA%';
CLAVE DESCRIPCION                    PROGRAMA
----- ------------------------------ ----------
CA    CLIENTE BUENO                  CLIENTE
CAA   CLIENTE MUY BUENO              CLIENTE
CAAA  CLIENTE EXCELENTE              CLIENTE
CAFEC CAF╔ CLARO                     COLOR
CAFEO CAF╔ OSCURO                    COLOR
CAF╔  CAF╔                           COLOR
CAMIS CAMISA O BLUSA                 TINTORERIA
7 rows selected.
SQL> select *
  2  from   tipo
  3  where  descripcion like 'CLIENTE%';
CLAVE DESCRIPCION                    PROGRAMA
----- ------------------------------ ----------
CA    CLIENTE BUENO                  CLIENTE
CAAA  CLIENTE EXCELENTE              CLIENTE
CC    CLIENTE MALO                   CLIENTE
CAA   CLIENTE MUY BUENO              CLIENTE
CB    CLIENTE REGULAR                CLIENTE
SQL> select *
  2  from   tipo
  3  where  descripcion like '%BUENO';
CLAVE DESCRIPCION                    PROGRAMA
----- ------------------------------ ----------
CAA   CLIENTE MUY BUENO              CLIENTE
CA    CLIENTE BUENO                  CLIENTE
SQL>

Sin embargo, hay que tener cuidado con el uso indiscriminado del like, porque aunque se puede usar, en ocasiones, causa que se tengan FULL TABLE SCAN al momento de ejecutarse sobre una tabla. Esto se puede ver en los siguientes ejemplos:

Con la igualdad (=):

SQL> select *
  2  from   cliente
  3  where  suav = 'DOWNY';
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 861343967
---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |    60 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| CLIENTE       |     1 |    60 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | CLIENTE_IDX01 |     1 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Como se puede ver, accede a la información vía el índice cliente_idx01 sin problema. Ahora, con like, pero con el campo completo:

SQL> select *
  2  from   cliente
  3  where  suav like 'DOWNY';
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 861343967
---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |    60 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| CLIENTE       |     1 |    60 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | CLIENTE_IDX01 |     1 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Sigue manteniendo el uso del índice. En el siguiente caso, cuando un caracter del medio no se conoce (_):

SQL> select *
  2  from   cliente
  3  where  suav like 'DO_NY';
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 861343967
---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |    60 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| CLIENTE       |     1 |    60 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | CLIENTE_IDX01 |     1 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Continua el uso del índice y un muy bajo costo para la consulta. Ahora, cuando se desconoce el final del texto:

SQL> select *
  2  from   cliente
  3  where  suav like 'DO_N%';
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 861343967
---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |    60 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| CLIENTE       |     1 |    60 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | CLIENTE_IDX01 |     1 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Nuevamente, se mantiene el uso del índice y su bajo costo. Como se puede observar, hasta el momento, todos los ejemplos son básicamente eficientes y sin problema. La tabla que estoy analizando tiene pocos registros. Si se hacen estos mismos ejemplos sobre una que tenga más, se puede observar un incremento pequeño en el costo cuando se usan ‘TEXTO%’ o ‘TEX_TO%’, pero no es tan significativo.

Ahora pasemos al ejemplo que especialmente más dañino es:

SQL> select *
  2  from   cliente
  3  where  suav like '%OWNY';
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 1138695813
-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     1 |    60 |    22   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| CLIENTE |     1 |    60 |    22   (0)| 00:00:01 |
-----------------------------------------------------------------------------
SQL> select *
  2  from   cliente
  3  where  suav like '%OWN%';
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 1138695813
-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     1 |    60 |    22   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| CLIENTE |     1 |    60 |    22   (0)| 00:00:01 |
-----------------------------------------------------------------------------
SQL> select *
  2  from   cliente
  3  where  suav like '_OWNY';
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 1138695813
-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     1 |    60 |    22   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| CLIENTE |     1 |    60 |    22   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Como se puede observar al poner los comodines % o _ al inicio del texto que estamos buscando, delimitando que no sabemos cómo es que comienza, Oracle se ve obligado a hacer un TABLE ACCESS FULL para encontrar la información.

Si esto se hace sobre una tabla que tiene varios millones de registros, causará que se demore un tiempo considerable en traer la información. Por tanto:

Es muy importante, considerar el uso del % y el _ al inicio de una cadena de texto al momento de usar el comparador LIKE dentro de una consulta a la base de datos.

Para dar solución a esto, se puede usar el Context Index, del cual, integraré información en un post que publicaré en breve. Para mayor información acerca del uso del LIKE en 10g, pueden acceder aquí.

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

Anuncios

23 Responses to Uso de Like en consultas

  1. acrsystemas says:

    Me parece muy buena la explicación y quizá puedas darme solución a me problema, tengo un formulario y en uno de los campos al realizar un SELECT uso LIKE, que ocurre pues los otros SELECT se me vuelven locos y me presenta la base de datos al completo, creo que es porque pierde el foco pero como hacer que lo vuelva a recuperar, estoy un poco pez en esto, muchas gracias de ante mano un saludo

  2. orlandoolguin says:

    Hola Acrsystemas,

    ¿Puedes por favor ahondar en cuanto al formulario? ¿En qué está hecho?

    ¿A qué te refieres con que “los select se vuelven locos”?

    Orlando.

  3. acrsystemas says:

    Pues si quieres te envio el codigo, a ver si tu ves donde falla, el formulario esta en un archivo html que llama a un archivo php y cuando hace las consultas en el archivo php al ejecutar la sentencia que lleva el operador like las demas consultas me presentan toda la base de datos y al final me hace la consulta que yo queria, no se si me he explicado bien si quieres te envio el codigo, muchas gracias por contestar, un saludo

  4. acrsystemas says:

    Aqui va el codigo por favor cuanto antes, ya que el cliente esta esperando y esta un poco desesperado, como por no encontrar la soluciion, un saludo, y gracias de antemano

    Datos de colegiados

    <?php $enlace = mysql_connect('localhost', 'comeal', 'cma001A');
    if (!$enlace) {
    die('No se pudo conectar : ' . mysql_error());
    }

    // Hacer que foo sea la base de datos actual
    $bd_seleccionada = mysql_select_db('comeal', $enlace);
    if (!$bd_seleccionada) {
    die ('No se puede usar la base de datos : ' . mysql_error());
    }
    $val_apellidos= $_POST['apellidos'];
    $resultado = mysql_query("SELECT * FROM Colegiados WHERE apellidos LIKE '$val_apellidos%'");
    if (!$resultado) {
    die('Consulta no válida: ' . mysql_error());
    }
    $val_especialidad= $_POST['Especialidad'];
    $resultado2 = mysql_query("SELECT * FROM Colegiados WHERE ESPECIALIDAD1='$val_especialidad'ORDER BY apellidos");
    if (!$resultado2) {
    die('Consulta no válida: ' . mysql_error());
    }

    $val_codigo= $_POST['CODIGO'];
    $resultado1 = mysql_query("SELECT * FROM Colegiados WHERE CODIGO='$val_codigo'");
    if (!$resultado1) {
    die('Consulta no válida: ' . mysql_error());
    }

    // if ( $consultaprivada == "on" ) {
    $resultado3 = mysql_query("SELECT * FROM Colegiados WHERE ESPECIALIDAD1='$val_especialidad' and CONSULTA='true'ORDER BY apellidos");
    if (!$resultado3) {
    die('Consulta no válida: ' . mysql_error());
    }
    // }

    echo " \n”;
    echo ” \n”;
    echo ” \n”;
    while ($row = mysql_fetch_row($resultado)){
    echo ” \n”;

    echo”
    $row[1] $row[2]
    Nº Colegiado:$row[0]
    $row[3]
    $row[4] $row[5]
    $row[6] $row[7]
    $row[9]
    $row[10]
    $row[11] “;
    echo ” \n”;
    }
    $consultaprivada = $_POST[‘consultaprivada’];
    if ( $consultaprivada == “on” ) {
    while ($row = mysql_fetch_row($resultado3)){
    echo ” \n”;

    echo”
    <p style='color: rgb(0, 0, 153);' title='Colegiado $row[0]
    $row[3]
    $row[4] $row[5]
    $row[6]
    $row[7] '
    $row[1] $row[2]
    “;
    echo ” \n”;}
    }
    else{
    while ($row = mysql_fetch_row($resultado2)){
    echo ” \n”;

    echo”
    <p style='color: rgb(0, 0, 153);' title='Colegiado $row[0]
    $row[3]
    $row[4] $row[5]
    $row[6]
    $row[7] '
    $row[1] $row[2]
    “;
    echo ” \n”;}
    }

    while ($row = mysql_fetch_row($resultado1)){

    echo ” \n”;

    echo”
    $row[1] $row[2]
    Nº Colegiado:$row[0]
    $row[3]
    $row[4] $row[5]
    $row[6] $row[7]
    $row[9]
    $row[10]
    $row[11] “;
    echo ” \n”;
    }

    mysql_close($enlace);

    ?>

  5. orlandoolguin says:

    Hola,

    La verdad, no conozco el código PHP, por lo que no te puedo indicar qué es lo que está pasando en él.

    ¿Ya posteaste esto en un blog o sitio de PHP?

    Orlando.

  6. acrsystemas says:

    No pasa nada seguire buscando ayuda muchas gracias

  7. orlandoolguin says:

    Hola,

    Disculpa por no poder ayudarte en PHP. ¿Ya probaste corriendo las consultas por separado para ver qué información te traen?

    Puedes comenzar con eso y en base a la información y con la lógica de tu programa, ver qué puede estar pasando.

    Orlando.

  8. acrsystemas says:

    Muchas gracias intentare esta idea.

  9. orlandoolguin says:

    Hola,

    Muy bien, ojalá que te salga esa opción.

    Orlando.

  10. acrsystemas says:

    Pues no me ha servido y me estoy volviendo loca, lo que me he dado cuenta es como si no realizara las condiciones muestra todos los datos de la base de datos no toma en cuenta lo que le digo en where al principio, pero al final de la presentación lo hace no se que ocurre

  11. orlandoolguin says:

    Hola ACR,

    Tengo la duda de si ya probaste bien las consultas en la base de datos de manera directa. ¿Funcionaron bien?

    Estuve investigando un poco acerca de PHP y MySQL y me encontré con esto que tal vez te sea de utilidad.

    El operador de concatenación en PHP es el punto (.).
    Los caracteres comodín para el LIKE en MySQL son los mismos que en Oracle: % para cualquier cantidad de caracteres que se desconoce y _ para un sólo caracter que se desconoce.

    Basados en esto y viendo una línea de tu código, ya sé por qué no está funcionando:

    $resultado = mysql_query(“SELECT * FROM Colegiados WHERE apellidos LIKE ‘$val_apellidos%'”);

    La consulta que le estás pasando en este formato a MySQL es el siguiente:

    select * from colegiados where apellidos like ‘$val_apellidos%’

    Es decir, el resultado de la variable $val_apellidos no sirve aquí porque lo estás metiendo como texto. Como busca a todos aquellos que casen con $val_apellidos.. puede que no encuentre nada.

    A mi modo de ver, tu línea de código debería ser:

    $resultado = mysql_query(“SELECT * FROM Colegiados WHERE apellidos LIKE ‘” . $val_apellidos . “%'”);

    Pruébalo y me dices si te funcionó.

    Orlando.

  12. acrsystemas says:

    Si funciona así y como ante tambien la consulta esa si funciona ese no el problema el problema es que cuando introduzco like esa consulta si me funciona pero el resto se ejecutan de la siguiente forma, me muestran toda la base de datos y al final se ejecuta la consulta y no se porque me hace eso por que me muestra toda la base de datos no lo entiendo., un saludo y muchas gracias

  13. orlandoolguin says:

    Hola ACR,

    Híjole, entonces ya no sé más, deja le pregunto el día de mañana a un conocido acerca de tu código a ver qué opina. Lo malo para ti, es que hasta será hasta mañana.

    Mientras tanto, verifica tu código, no sé si haya una herramienta de PHP donde puedas hacer un debug a tu código, es decir que vayas corriendo línea por línea y ver qué está pasando.

    También será bueno que expongas la duda en un foro de PHP si es que no lo has hecho ya.

    Orlando.

  14. acrsystemas says:

    Muchisimas gracias espero tu respuesta, un saludo

  15. Abi says:

    ¿Cómo mejorarías el performance de esta consulta?

    SELECT A.I_MESSAGE_HIST,
    A.I_MESSAGE,
    A.C_MODULE,
    A.C_FUNC,
    A.C_ACT,
    A.C_USER,
    A.C_COMMENT,
    A.C_FROM_STAT,
    A.C_TO_STAT,
    A.D_MESSAGE_HIST,
    A.C_ERROR_CODE,
    A.C_ERROR_TEXT,
    A.C_ERROR_LOC,
    A.D_MESSAGE_HIST,
    CASE
    WHEN (A.C_TO_STAT LIKE ‘%AIP%’)
    THEN ‘AIP’
    WHEN (A.C_TO_STAT LIKE ‘%FM%’)
    THEN ‘FM’
    WHEN (A.C_TO_STAT LIKE ‘%GIO%’)
    THEN ‘GIO’
    WHEN (A.C_TO_STAT LIKE ‘%SUMMIT%’)
    THEN ‘SUMMIT’
    ELSE NULL
    END AS C_DOWNSTREAM
    FROM OWNER.TABLE_NAME A

    DESCRIBE OWNER.TABLE_NAME
    Name Null? Type
    —————————————– ——– —————————-
    I_MESSAGE_HIST NOT NULL NUMBER(22)
    I_MESSAGE NOT NULL NUMBER(22)
    C_MODULE NOT NULL VARCHAR2(30)
    C_FUNC VARCHAR2(30)
    C_ACT NOT NULL VARCHAR2(30)
    T_MESSAGE CLOB
    C_USER NOT NULL VARCHAR2(20)
    C_COMMENT VARCHAR2(1000)
    C_FROM_STAT VARCHAR2(30)
    C_TO_STAT VARCHAR2(30)
    D_MESSAGE_HIST NOT NULL TIMESTAMP(6)
    C_ERROR_CODE VARCHAR2(500)
    C_ERROR_TEXT VARCHAR2(500)
    C_ERROR_LOC VARCHAR2(512)
    C_ERROR_MSG_DET CLOB

    SELECT COUNT(*) FROM OWNER.TABLE_NAME;
    COUNT(*)
    ———-
    6746408

    Distintos valores para la columna C_TO_STAT:
    AFFIRMACK
    AFFIRMNAK
    AFFIRMREC
    AFFIRMSENT
    AIPACK
    AIPEXEMPT
    AIPNAK
    AIPREC
    AIPRESENT
    AIPSEMT
    AIPSENT
    BACKUP_QUEUE_SOURCEBKUP
    BKUPACK
    BKUPBKUP
    BKUPNAK
    CCPNOTIFY
    CCPPUBLISH
    CLEARNAK
    CLEARREC
    COLNAK
    COLREC
    COMETACK
    COMETDDSACK
    COMETDDSERROR
    COMETDDSNAK
    COMETDDSNOTIFY
    COMETDDSREC
    COMETNAK
    COMETRESENT
    COMETRETRY
    COMETSENT
    DDSACK
    DDSBKUPACK
    DDSBKUPNAK
    DDSNAK
    DDSNOTIFY
    DISACK
    DISBKUP
    DISCCPACK
    DISCCPNAK
    DISCCPRESENT
    DISDATAMARTACK
    DISDATAMARTNAK
    DISDATAMARTRESENT
    DISDDSACK
    DISDDSBKUP
    DISDDSERROR
    DISDDSNAK
    DISDDSNOTIFY
    DISDDSREC
    DISDISENRICHACK
    DISDISENRICHNAK
    DISDISTERMFEEACK
    DISDISTERMFEENAK
    DISDISTERMFEEREC
    DISENRICHSENT
    DISERRORNOTIFY
    DISEVENT
    DISEVENTACK
    DISEVENTNAK
    DISEVENTRESENT
    DISEVENTSENT
    DISEXEMPT
    DISFEENAK
    DISFM_CLRREJ
    DISFMACK
    DISFMCLRREJ
    DISFMNAK
    DISFMREC
    DISFMRESENT
    DISFMRETRY
    DISFMSENT
    DISGIOACK
    DISGIONAK
    DISHLDACK
    DISHLDNAK
    DISHUBREC
    DISNAK
    DISNOTIFY
    DISNOTIFYACK
    DISNOTIFYNAK
    DISNOTIFYRESENT
    DISREC
    DISRESENT
    DISRETRY
    DISSENT
    DISSOIACK
    DISSOINAK
    DISTERMFEEACK
    DISTERMFEENAK
    DISTERMFEEREC
    DISTERMFEESENT
    DSVSENT
    EGATENAK
    EGATESENT
    ETFNOTIFYREC
    FMEXEMPT
    FMNOTIFY
    FMREC
    GDMHLDSENT
    GDMSOISENT
    GIOACK
    GIONAK
    GIONOTIFY
    GIOREC
    GIOSENT
    HLDACK
    HLDNAK
    HLDNOTIFY
    HLDREC
    HLDRESENT
    HLDSENT
    HUBBKUP
    HUBDDSNOTIFY
    HUBPUBLISH
    IMNOTIFY
    IMSENT
    NAK
    OPSSENT
    REC
    SMMDOCREC
    SMMDOCSENT
    SOIACK
    SOINOTIFY
    SOIREC
    SOISENT
    SUMMITEXEMPT
    SUMMITNAK
    SUMMITREC
    SUMMITRETRY
    SUMMITSENT
    SYSACK
    SYSNAK
    SYSREC
    TRCACK
    TRC-HUBACK
    TRC-HUBREC
    TRCNAK
    TRCNOTIFYREC
    TRCREC
    XLATEREC
    XLATESENT
    —– The column also could have NULL values

    SELECT COUNT(*) FROM OWNER.TABLE_NAME WHERE C_TO_STAT IS NULL;
    COUNT(*)
    ———-
    0

  16. Abi says:

    Yo creo que:
    a) no se puede usar indices porque la columna puede tener valores nulos ( en uat no tiene nulos pero en otro ambiente si hay como 77 registros donde esa columna tiene valor nulo)
    b) la clausula LIKE forza a hacer un full scan table …. ¿cómo remover por lo menos el % del principio tomando en cuenta que hay valores que contienen el string deseado en medio del valor completo?
    c) ¿Has usado los ctxcat indexes ? , Yo no los he usado y no se si aplicarían o no para este escenario

  17. Orlando Olguín Olvera says:

    Hola Abi.

    La consulta hace un FULL TABLE ACCESS porque no tiene ninguna cláusula de selección WHERE, por lo tanto, leerá toda la tabla.

    El LIKE que estás aplicando en la parte CASE no tiene qué ver con la selección de registros, sólo aplica sobre los registros que ya estás trayendo.

    Es decir, en un listado como el siguiente:

    C_MODULE C_TO_STAT
    X AIP10 <— El LIKE sólo valida sobre este valor.
    Y AIP11
    Z AIP12

    Se estarían haciendo 3 LIKES, uno para X, otro para Y y uno más para Z.

    Si vas a hacer un FULL TABLE ACCESS, lo único que podría pensar, es que si no hay nadie más conectado en la instancia, que le pongas un hint para que se ejecute en paralelo.

    Espero te sea ayuda.

    Orlando.

  18. mangel says:

    where no puede utilizar el signo =

  19. Orlando Olguín Olvera says:

    Hola Mangel.

    No entendí tu comentario.

    select campo
    from tabla
    where campo = valor;

    Es de los queries más básicos, se puede ver cómo el WHERE sí puede usar el signo de igual (=).

    Orlando.

  20. emilio serna says:

    tengo el siguiente codigo
    $sql=”SELECT usuariosec FROM amigos WHERE usuarioprin= :usuario AND usuariosec LIKE ‘%:buscar1%’ “;

    $sentencia=$this->conexion_db->prepare($sql);
    $sentencia->bindValue(“:buscar1”, $buscar);
    $sentencia->bindValue(“:usuario”, $usuario);
    $sentencia->execute();

    y me sale el siguiente error
    Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens’ in C:\xampp\htdocs\php\consulta.php:48 Stack trace: #0 C:\xampp\htdocs\php\consulta.php(48): PDOStatement->execute() #1 C:\xampp\htdocs\php\busquedaamigo.php(13): consulta->get_buscarusuarioamigo(‘mari’, ‘emilio’) #2 {main} thrown in C:\xampp\htdocs\php\consulta.php on line 48

    ese error solo me sale cuando pongo esto ‘%%’ pero si no se lo pongo solo me da resultados cuando pongo la palabra exacta,que puede ser?

  21. Orlando Olguín Olvera says:

    Hola Emilio.

    ¿Qué valor estás poniendo en $buscar?, ¿estás capturando algo del mismo tipo de datos que en usuariosec?

    El query se ve bien, pero hay que ver qué estás poniendo en los valores.

    ¿Probaste en poner algo así como: usuariosec like ‘:buscar1’ y en $buscar capturar los %?

    Por otro lado, si leíste mi post, recuerda que poner % al inicio es muy malo para el performance.

    Orlando.

  22. emilio serna says:

    En $buscar se introduce el valor “mar” y quiero que me encuentre el nombre de “mari” ,lo intente de todas las formas posibles, y si lei esa parte,no se si asi como este este optimizada la consulta?
    por puse primero que redusca la busqueda con la busqueda ” WHERE usuarioprin= :usuario”, no se si primero haga esa busqueda y despues busque ahora si a mari ,o si lo haga todo al mismo tiempo ?,pero por lo demas no se por que me marque el error.

  23. Orlando Olguín Olvera says:

    Hola Emilio.

    Oracle va seccionando la información con cada condición que se tenga en el WHERE.

    De esta forma, primero te trae la información de usuarioprin = a lo que pongas. De esta información, busca la de mari…

    Siempre todo query, debe probarse primero en un SQL*Plus o SQL Developer o TOAD, ¿ya lo hiciste para ver que obtenga bien los resultados?

    Orlando.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: