Función en sql server que reemplace iff de access

Tengo esta vista es access:
SELECT Activos.Apodo, [Activos]![Apodo] & " " & [Activos]![Activo] & " esta en Smartuns" & (IIf(([Activos]![Activo]="si"),(",está en la  " & [Vistas]![Nombre_vistas]),"")) AS Descripcion, Vistas.Id_vistas, Activos.Activo
FROM Vistas RIGHT JOIN Activos ON Vistas.Id_vistas = Activos.id_vista;
Como puedo pasarla a sql server 2005 y que me muestre los mismos datos, ya lo he intentado con EXISTS Y CON CASE:
IF EXISTS (select A.Activo FROM Activos A right JOIN Vistas V ON A.id_vista = V.Id_vistas where A.Activo='si' )
select A.Apodo,A.Apodo+' '+A.Activo+ ' ' +'esta en smartuns, en la '+ V.Nombre_vistas as Descripcion,
V.id_vistas,A.Activo
FROM Vistas V right JOIN Activos A
ON A.id_vista = V.Id_vistas
--where A.Activo='si'
else (select A.Activo FROM Activos A right JOIN Vistas V ON A.id_vista = V.Id_vistas where A.Activo='no' )
select A.Apodo,A.Apodo+' '+A.Activo+ ' ' +'esta en smartuns' as Descripcion,
V.id_vistas ,A.Activo
FROM Vistas V right JOIN Activos A
ON A.id_vista = V.Id_vistas
--where A.Activo='no'
Este es alguna de las filas que genera en access:
Sandra sandra no esta en Smartuns
Alma alma si esta en Smartuns, está en la Vista Sur 1 s


Agradezco a quien me pueda ayudar con este query,
1

1 respuesta

Respuesta
1
Te diría que con case pero como no te ha salido la otra opción que se me ocurre es que cambies la estructura de la sentencia en dos querys con un union
algo como
Select - los campos+ 'esta en la vista'& vista as Campo+ joins where Activo='Si'+ las otras condiciones
Union all
Select - los campos+ '' as Campo + joins where Activo<>'Si'+ las otras condiciones
Con eso tienes lo mismo de una forma más simple, e igual de rápido.
Que pena molestarte de nuevo, ya probé como tu me dijiste pero me genera este error, por el campo que falta en el segundo query, osera que yo estoy haciendo algo mal:
Msg 205, Level 16, State 1, Line 2
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
select A.Apodo,A.Apodo+' '+A.Activo+ ' ' +'esta en smartuns, en la '+ V.Nombre_vistas as Descripcion,
V.id_vistas,A.Activo
FROM Vistas V right JOIN Activos A
ON A.id_vista = V.Id_vistas
WHERE (A.Activo = N'si')
union
SELECT A.Apodo, A.Apodo + ' ' + A.Activo + ' ' + 'en smartuns' AS Descripcion, V.Activo, V.Id_vistas, A.Activo AS Activos
FROM dbo.Activos AS A RIGHT OUTER JOIN
dbo.Vistas AS V ON A.id_vista = V.Id_vistas
--where (A.Activo = 'si')
WHERE (A.Activo <> N'si')
Gracias de Nuevo por tu ayudo llevo dos días intentando de una u otra forma,
Los campos (numero y orden) de ambas querys deben ser los mismos y hay un campo duplicado en la 2ª. V.Activo quitálo y debería funcionar, si no comprueba los campos.
Te agradezco tu ayuda tan pronta,
Yo leí acerca de union un poco más, pero el problema en mis consultas es que en el primer query debo concatenar el nombre de un sitio si activo es igual a si, en el segundo query no lo debo concatenar porque no debe estar en un sitio si activo es igual a no, y lo
que me pasaba en los CASE o IF EXIST es que muestra uno de los dos resultados de los queries no los dos resultados unidos.
Este es mi dilema no se si lo pueda hacer con un cursor,
Gracias mil gracias..
Es lo mismo pero de otra manera:
En la 1ª consulta: Como tienes el where=Si. Concatenas
en la 2ª consulta. Como tienes el where=no no concatenas pero llamas al campo igual.
El tema es que los criterios de calculo y condiciones son diferentes pero los nombres de los campos y su posición en la query es igual en ambas.
1ª=>A.Apodo, concatenas as Descripcion, V.id_vistas,A.Activo
2ª=>A.Apodo, NO concatenas as Descripcion, V.id_vistas,A.Activo ( ahora tienes mas campos)
La union de las dos te da lo mismo que la que tenias pero con otro orden. Si quieres se lo puedes cambiar pero el ORDER BY solo se incluye en la 2ª
saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas