Explicación del operador de comparación meta_query

29 oct 2012, 19:47:40
Vistas: 182K
Votos: 63

He notado que hay varios operadores que se pueden usar para comparar en meta_query. Sin embargo, no estoy muy seguro de qué operador debo usar, es algo confuso como los operadores = y LIKE.

Me gustaría saber exactamente qué significa cada operador y en qué condición debería usarlos.

=            // Igual a
!=           // No igual a
>            // Mayor que
>=           // Mayor o igual que
<            // Menor que
<=           // Menor o igual que
LIKE         // Similar a (búsqueda parcial)
NOT LIKE     // No similar a
IN           // Está en un conjunto de valores
NOT IN       // No está en un conjunto de valores
BETWEEN      // Entre dos valores
NOT BETWEEN  // No está entre dos valores
NOT EXISTS   // No existe

Gracias.

0
Todas las respuestas a la pregunta 2
5
103

Los primeros operadores funcionan como cabría esperar:

=   igual
!=  no igual
>   mayor que
>=  mayor o igual que
<   menor que
<=  menor o igual que



LIKE y NOT LIKE

LIKE y NOT LIKE son operadores SQL que permiten usar caracteres comodín, por lo que podrías tener una consulta de metadatos como esta:

array( 
    'key' => 'nombre', 
    'value' => 'Pat', 
    'compare' => 'LIKE'
)

Esto devolvería todas las entradas donde el valor de metadatos "nombre" contenga la cadena "Pat". En este caso, se devolverían "Pat", "Patricia" y "Patrick". Hay una explicación no relacionada con WordPress aquí.

No es necesario añadir el carácter comodín %, ya que se añade por defecto como mencionó @Herb en su respuesta más abajo. Así: $meta_value = '%' . like_escape( $meta_value ) . '%'; - ver fuente.



IN y NOT IN

IN y NOT IN seleccionan coincidencias que están (o no están) en el array proporcionado. Podrías hacer algo como esto:

array(
    'key'     => 'color', 
    'value'   => array('rojo', 'verde', 'azul') 
    'compare' => 'IN'
)

y obtendría todas las entradas que tienen el color establecido como rojo, verde o azul. Usar 'NOT IN' obtiene lo contrario, cualquier entrada que tenga un valor diferente a los del array.

El SQL generado para esto se vería algo así:

SELECT * FROM posts_meta WHERE value IN ("rojo", "verde", "azul") 



BETWEEN y NOT BETWEEN

BETWEEN y NOT BETWEEN permiten definir un rango de valores válidos, y requieren que proporciones dos valores en un array en tu meta_query:

array( 
    'key' => 'precio', 
    'value' => array(20,30) 
    'compare' => 'BETWEEN'
)

Esto te dará todas las entradas donde el precio esté entre 20 y 30. Esta persona profundiza en un ejemplo con fechas.



NOT EXISTS

NOT EXISTS es exactamente lo que parece: el valor de metadatos no está establecido o es nulo. Solo necesitas la clave y el operador de comparación para esta consulta:

array( 
    'key' => 'precio', 
    'compare' => 'NOT EXISTS'
)

Esta persona necesitaba consultar valores de metadatos inexistentes y que funcionaran bien con otros.

¡Espero que esto ayude!

29 oct 2012 20:48:22
Comentarios

Nota: Si estás usando el array meta_query, tus claves no deben tener el prefijo meta_. Si estás usando $query->meta_key, $query->meta_value, etc., entonces estos deben conservar el prefijo.

Sean Sean
20 ago 2014 17:25:09

No encuentro una explicación sobre lo que hace la opción de comparación "IN". ¿Alguna idea de cómo funciona?

Joe Joe
9 mar 2015 16:50:07

@Joe, no sé por qué no agregué nada sobre "IN" y "NOT IN". He editado y actualizado la respuesta con esas comparaciones.

Jen Jen
9 mar 2015 18:05:40

Esta es una gran respuesta pero ahora hay algunas opciones más disponibles-: https://codex.wordpress.org/Class_Reference/WP_Meta_Query

noelmcg noelmcg
28 ago 2020 13:38:24

'EXISTS' , 'REGEXP', 'NOT REGEXP' y 'RLIKE'

noelmcg noelmcg
28 ago 2020 13:39:17
2
13

Ten en cuenta que al usar un valor meta_compare de 'LIKE', WordPress envuelve automáticamente el carácter comodín ( % ) alrededor de la cadena meta_value. Por lo tanto, el ejemplo 'Pat%' podría no devolver ningún resultado.

13 oct 2013 23:13:00
Comentarios

¿hay información sobre eso en la documentación en algún lugar Herb? ¿Debería el ejemplo cambiar para eliminar el %?

Jen Jen
22 nov 2013 17:47:01

Debería, de hecho acabo de hacer eso, mira el código fuente, entonces queda muy claro que Herb tiene razón. @guiniveretoo

Nicolai Grossherr Nicolai Grossherr
8 abr 2014 18:10:49