Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Select con Case no funciona (https://www.clubdelphi.com/foros/showthread.php?t=71683)

Paulao 03-01-2011 21:36:55

Select con Case no funciona
 
Este mi select no estas funcionando. El resultado estas null y no uno(1):

Código Delphi [-]
select
  case id_tecnico
  when null then
    coalesce(max(id_tecnico),0+1)
  end chave
from staff_tecnico
group by id_tecnico

Pero este abajo estas funcionando:


Código Delphi [-]
select coalesce(max(id_tecnico),0+1)chave from staff_tecnico

Porque el primero no funciona? Yo necesito hacer un Select con case, pues puede ser que la tabla, este field puede estar null o no, depende del cliente y necesito hacer una suma en el.

celades1 04-01-2011 08:02:53

Hola

El max dentro del case no esta bien creo
debes hacer una select para obtenerlo

No se exactamente lo que pretendes porque parece que haces un group by
y si hay valor nulo que coja el maximo valor del campo con lo que el group by te devolveria dos valores iguales el max y el null que lo convertirias en max
Haces coalesce del max por si es nulo eso corresponderia a que en toda la tabla el campo tiene valor nulo .
Si lo que quieres es poner el nulo a max+1 yo haria

Código SQL [-]
select  case id_tecnico  when null then    coalesce(select max(id_tecnico)+1 from staff_tecnico,1)  end chavefrom staff_tecnicogroup by id_tecnico

No se si te habre ayudado pero lo que si puedes tener claro es que case funciona perfectamente y el error esta en que no lo construyes bien

Saludos

Paulao 04-01-2011 22:22:43

Asi tambien, no funciona. Me lo da el error en el subquery.
Código SQL [-]
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, column 14.
select.

RONPABLO 05-01-2011 08:41:51

Código SQL [-]
select
  case when id_tecnico is null then
    coalesce(max(id_tecnico),0) + 1
  end chave
from staff_tecnico
group by id_tecnico

que tal así??

Paulao 05-01-2011 12:50:15

Ya lo hizo antes y continua NULL en el resultado. Creo yo que el problema sea el Case.

Código SQL [-]
select
  case when id_tecnico is null then
    coalesce(max(id_tecnico),1)
  end chave
from staff_tecnico
group by id_tecnico

guillotmarc 05-01-2011 13:27:27

¿ Cuando id_tecnico no sea nulo que resultado esperas en tu consulta ?. Puesto que tu case no lo contempla, por lo tanto no va a dar ningún resultado.

En tu consulta solo devuelves un resultado cuando id_tecnico es nulo. Si esto no es lo que realmente quieres, entonces tienes que añadir un else a la construcción case.

NOTA: Por cierto, ¿ esta consulta funciona de verdad ?. Esto de poner un campo en el resultado y una función de agregado sobre ese mismo campo, no lo veo nada claro. Una subconsulta para obtener la función de agregado (max) sería mucho mejor, en mi opinión.

¿ Esto es lo que quieres ?
Código SQL [-]
select
  case when id_tecnico is null then
    (select coalesce(max(id_tecnico),1) from staff_tenico)
  else
    id_tecnico
  end as chave
from staff_tecnico

Saludos.

Paulao 05-01-2011 13:43:05

Yo antes tenia hecho asi e vuelve NULL, quando id_tecnico es NULL, como ahora:
Código SQL [-]
select
  case when id_tecnico is null then
    (select coalesce(max(id_tecnico),1) from staff_tecnico)
  else
    (select max(id_tecnico)+1 from staff_tecnico)
  end as chave
from staff_tecnico
El resultado es NULL, pues el id_tecnico es NULL y deberia ser 1.

guillotmarc 05-01-2011 15:11:41

No me sorprende que esta última consulta no te funcione, personalmente no le encuentro ningún sentido, por más que la miro no llego a entender lo que pretendes conseguir con ella.

¿ Cuando en un registro no hay ID_TECNICO, quieres que devuelva un 1 o quieres que devuelva el mayor ID_TECNICO del resto de registros, incrementado en 1 ?. Y cuando un registro si tiene valor en ID_TECNICO, ¿ que quieres que devuelva esa consulta ?, ¿ ese mismo ID_TECNICO, el mayor ID_TECNICO en la tabla, ese último valor incrementado en uno, ... ?.

¿ Porqué no nos pones algunos ejemplo de los valores que puede haber en STAFF_TECNICO y de lo que estás buscando conseguir en cada caso ?.

Saludos.

guillotmarc 05-01-2011 15:15:18

Por cierto, si staff_tecnico no tiene ningún registro, no se va a volver ningún resultado, lo cual tu aplicación lo puede entender como un Nulo. Así que sería bueno que nos indicaras que valor pretendes devolver en ese caso (tabla vacía).

Paulao 05-01-2011 21:18:31

Mi idioma no ayudame a ser mas objetivo. Mira, tengo una aplicacion para varios clientes. Quando un cliente es nuevo, la tabla tine este campo como NULL. Pero hay clientes que ya tiene alguna cosa ya inserida. Tengo una funcion en delphi, que tiene por objetivo tomar este valor inicial y grabar en el banco de datos. Quando la tabla no tiene nada, entonces hago el coalesce y grabo uno(1) en la clave. Si tiene algo ya, hogo el max(campo) + 1. Seria mas o menos asi:
Código SQL [-]
select
  case when id_tecnico is null then
    (select coalesce(max(id_tecnico),1) from staff_tecnico)
  else
    (select max(id_tecnico)+1 from staff_tecnico)
  end as chave
from staff_tecnico
Este ejemplo ariba no funciona, por el CASE. Este es mi problema.

guillotmarc 06-01-2011 00:20:42

Sí, el idioma siempre es un problema :). Si quieres escribir en portugués, por mi encantado, lo hablo un poco (tengo amigos de Rio de Janeiro :)) y entiendo bastante bien el portugués escrito.

Lo siento pero sigo sin entender lo que estas buscando. El problema no es que no funcione por el CASE, el problema es que la consulta no está bien diseñada, dado que los CASE te puedo asegurar que funcionan muy bien.

¿ La tabla staff_tecnico la compartes entre varios clientes, verdad ?.

¿ Cuantos registros se supone que hay en staff_tecnico ?. Si solo hay uno, no entiendo la necesidad de usar la función de agregado max, y si hay más de un registro, ¿ vas a devolver varios registros con el mismo valor en todos ?, ¿ seguro que queremos devolver tantos resultados como registros en staff_tecnico ?.

Es que no consigo comprender el case when id_tecnico is null. ¿ Que se supone que queremos comparar aquí ?. ¿ El id_tecnico de cada uno de los registros en staff_tecnico ?, ¿ max(id_tecnico) ?.

Creo que si pones algunos ejemplos con lo que te puedes encontrar en la tabla y lo que quieres recuperar, sería más fácil de entender.

Saludos.


La franja horaria es GMT +2. Ahora son las 15:05:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi