¿Cuál es la mejor manera de convertir un int o null valor booleano en una consulta SQL, tal que:

  • Cualquier valor no nulo es VERDADERO en los resultados
  • Cualquier valor nulo es FALSO en los resultados
InformationsquelleAutor Thomas Bratt | 2008-10-07

9 Comentarios

  1. 50

    A mi conocimiento (corríjanme si estoy equivocado), no existe el concepto literal de valores booleanos en SQL. Usted puede tener expresiones que se evalúan a los valores booleanos, pero no de salida.

    Dicho esto, se puede utilizar el CASO CUANDO para producir un valor que se puede utilizar en una comparación:

    SELECT 
        CASE WHEN ValueColumn IS NULL THEN 'FALSE' ELSE 'TRUE' END BooleanOutput 
    FROM 
        table 
    • Para hacer más fácil para consumir el resultado en código, prefiero devolver un valor de bit donde – en esencia – un valor booleano que se espera.
    • POCO tiene sus propias trampas (al menos es de T-SQL). En realidad no es un tipo de datos boolean (internamente, una máscara de bits se utiliza para almacenar los valores de la unión). Este tiene el rendimiento y la indexación de implicaciones. Usar CHAR(1) o INT podría ser más sabio.
    • Además, para SQL Server: «La cadena de valores «VERDADERO» y «FALSO» puede ser convertido a los valores de los bits: ‘TRUE’ se convierte en 1 y ‘FALSE’ se convierte en 0.»
    • El uso de un tipo de datos varchar cuando OP solicita explícitamente un valor booleano que no parece ser la solución correcta. Al menos debe mostrar cómo devolver un bit. Debido a que es el Boolean asignación de tipo de sql-server .NET. Ver aquí
    • Mi respuesta contornos, y cito, «puede CASO de uso CUANDO para producir un valor de uso». En ninguna parte he implica que tiene que ser de tipo VARCHAR. También lo .NET asignaciones tienen que ver con cualquier cosa, aquí no es muy clara.
    • OP quiere devolver un bool. Dado que no existe un verdadero tipo bool que usted puede devolver el más cercano en sql-server es bit. Que es también el tipo de datos que tener usar cuando se desea leer como bool sin necesidad de conversión en la mayoría de los lenguajes de programación como C++, .NET o java. Por lo que parece ser relevante. También, dado que el título le pide una conversión entre int a bool sería útil para los futuros lectores para mostrar CAST(CASE WHEN ValueColumn IS NULL THEN 0 ELSE 1 END AS bit) AS BooleanOutput.
    • Entiendo tu punto, pero es un detalle de implementación que es parte o la relación de SQL y, a decir, .NET. El uso de los BITS de tipo de datos no es más cerca de un Booleano true que el CHAR(1) 'Y'y 'N' sería. El punto esencial de todo el asunto es que T-SQL no tiene Booleanos y que es necesario utilizar algún tipo de convenio para que los represente. Este convenio puede ser influenciado por el idioma que están interactuando con – tal vez C#, tal vez algo más – y no tiene nada que ver con SQL en sí. Su «CASO CUANDO»-es exactamente equivalente a la mía. 😉

  2. 17

    Sin necesidad de utilizar el caso… cuando:

    select (column_name is not null) as result from table_name;

    Devuelve 1 para todos los campos no NULOS y 0 para todos los campos que son NULOS, que está tan cerca como se puede llegar a valores booleanos en SQL.

    • isnull() necesita un segundo parámetro en T-SQL: ISNULL(valor, valor-si-null)
    • ah seguro. gracias por el comentario
    • ‘(no column_name es null)’ no es una expresión válida cualquiera. 😉
    • Es posible que funcione para MySQL, pero un montón de cosas extrañas ‘de conveniencia’ sintaxis funciona para MySQL que no se ejecuta en otros lugares.
    • «es nulo» es perfectamente válido predicado en ANSI SQL. Esto debería funcionar en todas partes (debe!)
    • iirc la correcta sintaxis t-sql sería: «column_name no es nulo» o «no es» null » o algo así
    • No del todo. ‘ColumnName NO ES NULL’ es la sintaxis correcta. T-SQL no tiene nada que ver con ella, esta ist estándar de SQL.
    • Yo no digo ‘NULO’, sería incorrecta. Leer de nuevo.
    • esto funciona en MySql demasiado. actualizado
    • No puede conseguir que esto funcione en SQL Server 2005. Alguna idea?
    • se intenta «NO (column_name ES NULL)»?
    • Ni ‘(column_name ES NULL)’ ni ‘(column_name NO ES NULL)’ no producen ningún valor. Sólo pueden ser utilizados como una expresión booleana, como en el CASO de CUANDO [expresión], a CONTINUACIÓN, ‘true-valor’ ELSE ‘falso-valor’ FINAL
    • Esto funciona muy bien para PostgreSQL, lo que resulta en un valor booleano.

  3. 4
    SELECT 
        CASE
            WHEN thevalue IS NULL THEN 0
            ELSE 1
        END AS newVal
    FROM .... (rest of select)

    Creo que es algo como esto

    Realidad, la ISNULL, puede ser necesario CUANDO el valor ES NULL, 0

    • ISNULL() necesita un segundo parámetro en T-SQL: ISNULL(valor, valor-si-null)
  4. 4

    Suponiendo que desea 0,1 valor como un retorno, y que estamos hablando entero me gustaría utilizar la lógica especificada por Torbjörn y se envuelve en la función

    create function dbo.isNotNull(@a int)
    returns bit
    as
    begin
    return isnull(@a-@a+1,0)
    end

    entonces usted puede usarlo cuando lo necesite simplemente llamando a

    select dbo.isNotNull(myIntColumn) from myTable

    La respuesta proporcionada por Tomalak es más universal, aunque como sería trabajar con cualquier tipo de datos

  5. 3

    Usted lo desea, puede hacer una conversión(BITS, el Valor de su resultado. Porque algo de SQL, se devolverá un error de que el valor no es un valor booleano.

    • Este poco que me permitió tener una donde declaración de comprobación 1 o ‘true’
    • Esto resulta en verdadero/null en vez de verdadero/falso.
  6. 1

    En Oracle, suponiendo que se utilice 0 para falso y 1 por cierto:-

    SELECT DECODE( col, NULL, 0, 1) FROM ...

    También se puede escribir esta usando el CASO de la sintaxis, pero el de arriba es idiomáticas en Oracle. DECODIFICAR es un poco como un switch/case; si col es NULL, se devuelve 0, en otro caso 1.

    • Esta respuesta debería ser upvoted. Decodificar es la más fácil y la mayoría de la representación concisa de IF then ELSE.
  7. 0

    La más corta de todas las que conozco para Oracle:

    SELECT NVL2(nullableColumn, 1, 0) FROM someTable

    NVL2(value, ifNotNull, ifNull) devuelve ifNotNull si el value no es null, y ifNull lo contrario.

  8. 0

    Por lo general, cuando el uso de 1, significa que es verdadero y otro en otro caso.

    Así:

    SELECT  IsDefault = CASE WHEN IsDefault = 1 THEN 'true' ELSE 'false' END
    FROM table

Dejar respuesta

Please enter your comment!
Please enter your name here