2017-05-26 1 views
1

Hallo Ich lernte SQL Server BIT hat wahr, falsch und unbekannt. Zum Beispiel ergibt der Vergleich 1 > NULLunknown.wie auf UNBEKANNT in Sql-Server boolean zugreifen?

Ich weiß, ich kann es indirekt überprüfen: wenn x is null or y is null, dann muss der Vergleich x > yunknown sein.

Gibt es eine Möglichkeit, direkt auf unknown zuzugreifen? Zum Beispiel

select * 
into #t 
from (
    SELECT 1 as [x], 1 as [y] UNION ALL 
    SELECT 1 as [x], 2 as [y] UNION ALL 
    SELECT 1 as [x], NULL as [y] 
) as a 


SELECT * 
from #t 
--x y 
--1 1 
--1 2 
--1 NULL 

select * 
    ,/* ???? */ as [is x > y] 
from #t 
--want to have: 
--x y  is x > y 
--1 1  0 
--1 2  0 
--1 NULL unknown 
+2

Ich denke, "unbekannt" wird als "NULL" dargestellt. –

Antwort

1

Dies funktioniert:

select * 
into #t 
from (
    SELECT 1 as [x], 1 as [y] UNION ALL 
    SELECT 1 as [x], 2 as [y] UNION ALL 
    SELECT 1 as [x], NULL as [y] 
) as a 


SELECT * 
from #t 
--x y 
--1 1 
--1 2 
--1 NULL 

select *, 
    case 
     when x > y then '1' 
     when x is null or y is null then 'unknown' 
     else '0' 
     end as [is x > y] 
from #t 

--x y is x > y 
--1 1 0 
--1 2 0 
--1 NULL unknown 

-- Don't forget to delete your temp table when done. 
drop table #t 
+0

Vielen Dank @Chuck ist nicht die Idee der Temp-Tabelle, die Sie brauchen, um es nicht fallen zu lassen? –

+0

Hi Y Zhang, ich denke, dass es nur eine Best Practice ist, siehe hier: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/522d302a-857f-4730-b49f-cca7fb236912/is- es-not-to-clean-up-drop-temporären-Tabellen-in-gespeicherten-Prozeduren? Forum = transactsql – Chuck

+0

@YZhang, Haben Sie jemals funktioniert das? – Chuck

0

Sie benötigen einen CASE Ausdruck mit einem IS NULL Prädikat die Zeichenfolge ‚unbekannt‘ zurück als letzte Spalte Wert, der auch die anderen benötigen '0' und '1' Werte als Varchar-Literale, um eine implizite Umwandlung des 'unbekannten' String-Literals in int zu vermeiden.

SELECT 
     x 
    , y 
    , CASE WHEN x > y THEN '1' WHEN x <= y THEN '0' ELSE 'unknown' END AS [is x > y] 
FROM #t;