SQL - where condicionado

 
Vista:
Imágen de perfil de Gabriel

where condicionado

Publicado por Gabriel (5 intervenciones) el 23/09/2008 16:08:55
Saludos foreros
tengo una duda a ver si alguien me puede ayudar, o al menos dar una idea.

Tengo el siguiente select

1
2
3
4
5
6
7
8
9
10
11
12
select codigo_inicio, descripcion, compania
from tablaDatos with(nolock)
where       oricod = @OriCod
       and equtip = 'CIA'
       and (IF CiaDes NOT NULL
                   BEGIN
                         CodEqu = @CiaDes
                   END
               ELSE
                   BEGIN
                         CodEqu = @CiaPAR
                   END

hasta donde esta el and equtip = 'CIA', esta todo bien.
mi idea es condicionar la clausula WHERE, para que dependiendo de alguna condicion (en este caso Ciades NOT NULL) incluya como condicion del where, una u otra sentencia

Se puede hacer esto? o tengo que hacer el IF fuera del select ??

Saludos, Gabriel Fabres
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

Posible respuesta...

Publicado por Leopoldo Taylhardat (93 intervenciones) el 23/09/2008 16:37:17
Saludos...
En SQL Anywhere puedes escribirlo así...

select codigo_inicio, descripcion, compania, IF CiaDes IS NOT NULL then ciades else CiaPAR ENDIF AS CodEqu
from tablaDatos with(nolock)
where oricod = @OriCod
and equtip = 'CIA'

asumo que CiaDes y CiaPAR son columnas de la tabla 'tablaDatos'
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
Imágen de perfil de Gabriel Fabres

RE:Posible respuesta...

Publicado por Gabriel Fabres (5 intervenciones) el 23/09/2008 18:26:26
Hola. gracias por responder.

en realidad, lo que quiero condicionar, es el where, es decir, que para determinada existencia de una ncondicion, poder tomar una accion, pero en el where. lo que tu indicas, es una condicion en el select.

de todas formas, buscando por ahi, encontre una solucion, que aunque un poco "bruta" por llamarla de alguna forma, es facil de implementar.
la idea es poner toda la instruccion select algo from alguna_tabla where (tal_condicion) (evaluada con un if.... dentro de una variable de texto. y ejecutar el resultado de la concatenacion, con un excec.

Para que quede mas claro, aca va un ejemplo

Este seria el Store con los IF fuera del select.

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
 
alter procedure [dbo].[__QBE_UP_WEB_QBE_GET_SET_SINONIMOS_EMPRESAS]
   @CMD   varchar(1),
   @OriCod varchar(15),
   @Atribb varchar(10) = '',
   @CiaDes varchar(100) = ''
 
AS
 
set nocount on
if @CMD = 'G'    begin
      if @CiaDes != ''
         if @atribb = 'L'  -- aca el atributo nos define una u otra forma de hacer la busqueda
            begin
               select e.codini, e.CodEqu, c.ciades
               from bdcmc..equtab e with(nolock)
                   inner join bdcmc..ciatab c on e.codini = c.ciacod
               where   e.oricod = @OriCod
                  and e.equtip = 'CIA'
                  and e.CodEqu like '%'+@CiaDes+'%'
               return 2
            end
         else
            begin
               select e.codini, e.CodEqu, c.ciades
               from bdcmc..equtab e with(nolock)
                   inner join bdcmc..ciatab c on e.codini = c.ciacod
                                       and c.oricod = @OriCod
               where   e.oricod = @OriCod
                  and e.equtip = 'CIA'
                  and e.CodEqu = @CiaDes
               return 3
            end
      else      -- si no se establece el valor de CiaDes
         begin
            select e.codini, e.CodEqu, c.ciades
            from bdcmc..equtab e with(nolock)
                inner join bdcmc..ciatab c on e.codini = c.ciacod
            where   e.oricod = @OriCod
               and e.equtip = 'CIA'
         end
 
      return
   end
 
if @CMD = 'S' or @atribb != '' or @Ciades != ''
   begin
      if @CiaDes != ''
         begin
            insert into bdcmc..equtab (OriCod, EquTip, AplCod, CodIni, CodEqu, EquEst, CodEquMas)
            values (@OriCod, 'CIA', 'QBENCH', @Atribb, @CiaDes, '1', NULL  )
            return
         end
   end

en este caso, los parametros pasados al SP definen varias cosas, como por ejemplo, como se realiza la busqueda.

mi idea, es poder definir esto dentro de la clausula where, para lo cual concateno todo el SP, dependiendo de los parametros incluyo o excluyo las diferentes alternaticas del where

Se ve un poco enredado, pero creo que es efectivo cuando tienes un SP que maneja muchos parametros, y no quieres hacer un IF por cada uno de ellos

La solucion final quedaria de la siguiente forma.
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
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
 
alter procedure [dbo].[__QBE_UP_WEB_QBE_GET_SET_SINONIMOS_EMPRESAS_SA]
   @CMD   varchar(1),
   @OriCod varchar(15),
   @Atribb varchar(10) = '',
   @CiaDes varchar(100) = ''
 
AS
 
set nocount on
declare @SqlInstruccion as varchar(1000);
if  @CMD = 'G'
    begin
   set @SqlInstruccion = 'select e.codini, e.CodEqu, c.ciades from bdcmc..equtab e with(nolock) inner join bdcmc..ciatab c on e.codini = c.ciacod and c.oricod = @OriCod where   e.oricod = @OriCod and e.equtip = "CIA"'
-- aca dependiendo de la existencia de los parametros ejecuto acciones para agregar a la variable
-- las diferentes clausulas de acuerdo a lo que necesite en el where en este caso
      if @atribb != 'L' -- utilizo un sistema de busqueda exacta
         begin set @SqlInstruccion = @SqlInstruccion + 'and e.CodEqu = @CiaDes' end
      else
         begin set @SqlInstruccion = @SqlInstruccion + 'and e.CodEqu like "%"+@CiaDes+"%"'end
   end
exec (@SqlInstruccion)
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

RE:Posible respuesta...

Publicado por pacopaz (143 intervenciones) el 23/09/2008 18:32:45
Te podría llegar a servir la cláusula case... when.
Para más información, refierete a esta página:
http://msdn.microsoft.com/es-es/library/59bz1f0h(VS.80).aspx

Espero que te sirva.

saludos.
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

RE:Posible respuesta...

Publicado por Isaias (5072 intervenciones) el 23/09/2008 18:40:50
Again

Nos serviria mucho a los foreros, saber que VERSION DE MOTOR DE BASE DE DATOS estan ocupando, esto lo he pedido mas de una vez.

"Estoy ocupando SQL SERVER 2005 STANDAR EDITION, SERVICE PACK 2 y mi problema es................................"

De lo contrario, hay que estar ADIVINANDO en que estan codificando.

Saludos

PD: Y como bien dice pacopaz, esto lo resuelves con un CASE WHEN........
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
Imágen de perfil de Gabriel Fabres

RE:Posible respuesta...

Publicado por Gabriel Fabres (5 intervenciones) el 23/09/2008 18:49:11
sorry man, no habia reparado en ese punto Estoy ocupando SQL SERVER 2005 Developer Edition, SP2.

en realidad mi problema no es el uso de la sentencia condicional if, case, lo que sea..... mi problema es.... poner condiciones dentro del where... de modo de ejecutar una determinada porcion de codigo, dependiendo de valores pasados como parametros al SP.
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

RE:Posible respuesta...

Publicado por pacopaz (143 intervenciones) el 23/09/2008 20:41:13
Veamos tu código inicial.
Si no quieres hacerlo con case when y tienes problemas con el if (por que esto no se implementa así), utiliza el método IsNull de la siguiente manera:

select codigo_inicio, descripcion, compania
from tablaDatos with(nolock)
where oricod = @OriCod
and equtip = 'CIA'
and CodEqu = IsNull(@CiaDes, @CiaPAR)

Para mayor información acerca del método IsNull, ve a esta página:
http://msdn.microsoft.com/en-us/library/ms184325.aspx

Espero que te sirva.

Saludos.
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

RE:Posible respuesta...

Publicado por Car (1 intervención) el 16/10/2014 01:30:29
usando senetencias UNION ALL

select codigo_inicio, descripcion, compania
from tablaDatos with(nolock)
where oricod = @OriCod
and equtip = 'CIA'
and CiaDes NOT NULL and CodEqu = @CiaDes

union all

select codigo_inicio, descripcion, compania
from tablaDatos with(nolock)
where oricod = @OriCod
and equtip = 'CIA'
and CiaDes NULL and CodEqu = @CiaPAR
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

RE:Posible respuesta...

Publicado por Alberto (1 intervención) el 06/10/2008 21:42:54
no mamen ke culeros esto no sirve
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