2009-01-30 15 views
40

Quiero crear un Seleccionar SQL para hacer una prueba de unidad en MS SQL Server 2005. La idea básica es la siguiente:expresiones booleanas en SQL Select lista

seleccione 'Nombre de la prueba', foo = 'resultado' de bar donde baz = (algunos criterios)

La idea es que, si el valor de la columna "foo" es "Resultado", entonces obtendría un valor de verdadero/1; si no es así, obtendría falso/0.

Desafortunadamente, a T-SQL no le gusta la expresión; se ahoga en el signo igual.

¿Hay alguna manera de evaluar una expresión en la lista de selección de SQL y obtener un resultado retornable? (? O alguna otra forma de lograr la unidad de pruebas que yo quiero)


EDIT: 3 grandes, respuestas, todos construidos alrededor de la caja. Aceptaré la fe de feihtief, ya que tiene la menor representación y, por lo tanto, la necesita más. :-) Gracias a todos.

+1

Nunca dejará de sorprender lo ridículo que es el manejo de booleanos de TSQL. Gran pregunta por cierto. – hajikelist

Respuesta

17
SELECT 'TestName', 
    CASE WHEN Foo = 'Result' THEN 1 ELSE 0 END AS TestResult 
FROM bar 
WHERE baz = @Criteria 
13

Caso de uso:

SELECT 'Test Name' [col1], 
    CASE foo 
    WHEN 'Result' THEN 1 
    ELSE 0 
    END AS [col2] 
FROM bar 
WHERE baz = (some criteria) 
+0

Este es ligeramente mejor porque usa la 'caja' de igualdad optimizada, es decir, 'caso foo cuando' Resultado 'en lugar de' caso cuando foo = 'Resultado' ' –

+0

@MarkSowul: ¿Puede proporcionarnos alguna información sobre cómo el caso simple? está optimizado sobre el caso buscado? Siempre tuve la impresión de que un caso simple es evaluado o reescrito por el analizador en un caso buscado, pero basado en esto (http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of -the-case-expression) Creo que hay muchos casos del mundo real en los que podrías tener razón. –

+0

Lo siento, no recuerdo en este momento. Recuerdo vagamente ver diferentes planes de ejecución en una situación particular. Esto también habría sido antes del SQL 2012. Aunque al final porque el 'caso simple' (caso x cuando y) es más restringido, el optimizador debería tener un tiempo más fácil con él –

5

También puede utilizar:

select 
    'Test Name', 
    iif(foo = 'Result', 1, 0) 
from bar 
where baz = (some criteria) 

Sé que esto se le preguntó hace un tiempo, pero espero que esto ayude a alguien por ahí.

+1

IIF solo está disponible desde Sql Server 2012 en wards y Sql Azure como Hasta donde yo sé (https://msdn.microsoft.com/en-za/library/hh213574.aspx) –