MySQL - Case o IF

 
Vista:
sin imagen de perfil
Val: 16
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Case o IF

Publicado por Hercross (26 intervenciones) el 07/06/2018 16:38:13
Hola buenas tardes..

Tengo una select del tipo:

1
SELECT username, nombre FROM users INNER JOIN permisos ON users.permisos=permisos.id_permisos WHERE nombre<>"pepe";

Hasta ahí todo bien..

La cuestion es que tengo que hacer el
1
WHERE nombre<>"pepe"
solo cuando una variable que tengo llamada valor = 1, es decir..

1
if(valor==1) WHERE nombre<>"pepe"

Hay alguna forma de meter esto en la sql?

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 98
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Case o IF

Publicado por Yamil Bracho (40 intervenciones) el 07/06/2018 16:46:23
Puede ser algo como

WHERE
( IF((valor==1), nombre<>"pepe", 1=1 )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Case o IF

Publicado por leonardo_josue (414 intervenciones) el 07/06/2018 17:16:53
Hola Hercross:

Lo que quieres hacer se resuelve con ÁLGEBRA BOOLEANA y lo haces utilizando los operadores lógicos (AND, OR, NOT)...

Podría ser así, supongamos que tienes esta tabla

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM tabla;
+------+--------+-------+
| id   | nombre | valor |
+------+--------+-------+
|    1 | pepe   |     1 |
|    2 | pepe   |     2 |
|    3 | leo    |     1 |
|    4 | leo    |     2 |
+------+--------+-------+
4 rows in set (0.00 sec)

entonces, lo que pones en tu post, podrías ponerlo así:

1
2
3
4
5
6
7
mysql> SELECT * FROM tabla WHERE valor = 1 and nombre <> 'pepe';
+------+--------+-------+
| id   | nombre | valor |
+------+--------+-------+
|    3 | leo    |     1 |
+------+--------+-------+
1 row in set (0.00 sec)

Es decir, filtrar todos los registros que tengan valor = 1 y que nombre sea diferente de 'pepe' (en este caso sólo hay un registro que cumple con el criterio.

Otros ejemplos serían así:

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM tabla WHERE (valor = 1 and nombre <> 'pepe') or (valor = 2);
+------+--------+-------+
| id   | nombre | valor |
+------+--------+-------+
|    2 | pepe   |     2 |
|    3 | leo    |     1 |
|    4 | leo    |     2 |
+------+--------+-------+
3 rows in set (0.00 sec)

En este caso muestra todos aquellos registros que tengan valor = 1 y nombre distinto de 'pepe' o todos aquellos registros que tengan
valor = 2, sin importar qué nombre tienen. ¿Se entiende?

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 16
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Case o IF

Publicado por Hercross (26 intervenciones) el 07/06/2018 17:25:28
Hola, muchas gracias a los dos por responder..

Creo que me he explicado mal..

Lo que yo quería hacer, con la select normal, sin el where, me mostraría todos las rows.. si le pongo el where, me muestra solo los que tengan el nombre diferente a pepe..

Lo que quiero es poder hacer que el where solo se haga si se cumple que valor = 1, pero valor es una variable de mi php, no un campo de la db.

Hacer un select de los campos correspondientes, y si valor = 1 meter el where nombre <> "pepe".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Case o IF

Publicado por Raymundo (2 intervenciones) el 07/06/2018 17:59:58
Buenas Hercrosss

Pues es tan fácil como filtrarlo por el código, es decir, es más de tema de PHP que de tema de MySQL, sería algo parecido a esto:
1
2
$sql = "SELECT username, nombre FROM users INNER JOIN permisos ON users.permisos=permisos.id_permisos";
if($valor == 1) $sql.= " WHERE nombre<>'pepe'";

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Case o IF

Publicado por leonardo_josue (414 intervenciones) el 07/06/2018 19:31:14
Hola de nuevo:

el punto de Raymundo es válido desde PHP, pero con MySQL podrías trabajar con Sentencias Preparadas, para armar la consulta de acuerdo a lo que necesites y en lugar de hacer una consulta, tendrías que trabajar con Procedimientos almacenados, es decir, algo así;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS prueba$$
Query OK, 0 rows affected (0.03 sec)
mysql> CREATE
    ->     PROCEDURE prueba(variable INT)
    ->     BEGIN
    ->       SET @SQL = 'SELECT * FROM tabla ';
    ->       IF (variable = 1) THEN
    ->          SET @SQL = CONCAT(@SQL, 'WHERE nombre <> \'pepe\'');
    ->       END IF;
    ->       SELECT @SQL;
    ->     END$$
Query OK, 0 rows affected (0.00 sec)
 
mysql> DELIMITER ;
mysql> CALL prueba(1);
+--------------------------------------------+
| @SQL                                       |
+--------------------------------------------+
| SELECT * FROM tabla WHERE nombre <> 'pepe' |
+--------------------------------------------+
1 row in set (0.00 sec)
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> CALL prueba(2);
+----------------------+
| @SQL                 |
+----------------------+
| SELECT * FROM tabla  |
+----------------------+
1 row in set (0.00 sec)
 
Query OK, 0 rows affected (0.01 sec)

En este caso, el SP "genera" una consulta al vuelo, dependiendo del parámetro que le estás enviando. Una vez que tengas la consulta, entonces como te comenté, utilizas Sentencias Preparadas para ejecutarla y regresar el resultado de la ejecución.

http://download.nust.na/pub6/mysql/doc/refman/5.0/es/sqlps.html

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar