How to emulate a boolean with MSSQL

  • Microsoft SQL Server does not support the following: where Boolean_Column=true or where Boolean_Column=false.
  • The closest approximation is to create a column, assign it a bit datatype, then check for 1 for True or 0 for False.
  • The problem that, when upgrading/converting from other databases then, we have values like: T or t or True or true or 1 for true and F or f or False or false or 0. Now how do we deal with all these variation so we can clean it up.

Applies to:

  • Microsoft SQL Server 2000
  • Microsoft SQL Server 2005
  • Microsoft SQL Server 2008

Data used

  1. USE sql911;
  2. go
  3. SELECT sales_date,sales_qty,sales_price,logical
  4. FROM sales02;
  5. go
sales_date              sales_qty                               sales_price                             logical
----------------------- --------------------------------------- --------------------------------------- -------
2005-10-06 10:01:01.000 10.00                                   11.75                                   true
2006-10-06 10:01:01.000 10.00                                   11.75                                   1
2005-11-06 10:01:01.000 9.00                                    11.75                                   0
2006-10-06 10:01:01.000 10.00                                   11.75                                   t
2005-12-06 11:01:01.000 8.00                                    11.75                                   T
2006-02-06 13:01:01.000 6.00                                    11.75                                   false
2006-05-06 16:01:01.000 3.00                                    11.75                                   F
2004-10-06 10:01:01.000 10.00                                   11.75                                   0
2005-11-06 10:01:01.000 9.00                                    11.75                                   False
2006-06-06 17:01:01.000 2.00                                    11.75                                   True
2006-01-06 12:01:01.000 7.00                                    11.75                                   Yesw
2006-02-06 13:01:01.000 6.00                                    11.75                                   Y
2005-03-06 14:01:01.000 5.00                                    11.75                                   yes
2006-10-06 10:01:01.000 10.00                                   11.75                                   No
2006-10-06 10:01:01.000 3.00                                    11.75                                   N
2006-10-06 10:01:01.000 10.00                                   11.75                                   n
2004-03-06 14:01:01.000 5.00                                    11.75                                   -1
2005-04-06 15:01:01.000 4.00                                    11.75                                   NULL
2005-05-06 16:01:01.000 3.00                                    11.75                                   NULL
2006-07-06 19:01:01.000 1.00                                    11.75                                   1
2006-03-06 14:01:01.000 5.00                                    11.75                                   NULL
2006-04-06 15:01:01.000 4.00                                    11.75                                   NULL
2006-06-06 17:01:01.000 2.00                                    11.75                                   NULL
2007-05-07 11:30:00.000 2.00                                    10.50                                   NULL
2007-05-08 13:30:00.000 1.00                                    10.00                                   NULL
2006-07-06 19:01:01.000 1.00                                    11.75                                   NULL
2007-05-09 14:00:00.000 1.25                                    10.00                                   2
2007-11-06 10:01:01.000 9.00                                    11.75                                   NULL
2007-05-10 14:00:00.000 5.00                                    10.00                                   T
2007-05-11 14:15:00.000 4.00                                    10.00                                   F
2007-05-12 15:00:00.000 2.00                                    10.00                                   false
2007-05-13 16:00:00.000 1.00                                    10.00                                   0

(32 row(s) affected)

Boolean values

  1. SELECT sales_date,sales_qty,sales_price,logical,
  2.        CASE WHEN CHARINDEX(LEFT(UPPER(logical), 1), 'T1Y') > 0
  3.             THEN 'True'
  4.             ELSE 'False'
  5.        END AS 'Boolean'
  6. FROM sales02;
sales_date              sales_qty                               sales_price                             logical Boolean
----------------------- --------------------------------------- --------------------------------------- ------- -------
2005-10-06 10:01:01.000 10.00                                   11.75                                   true    True
2006-10-06 10:01:01.000 10.00                                   11.75                                   1       True
2005-11-06 10:01:01.000 9.00                                    11.75                                   0       False
2006-10-06 10:01:01.000 10.00                                   11.75                                   t       True
2005-12-06 11:01:01.000 8.00                                    11.75                                   T       True
2006-02-06 13:01:01.000 6.00                                    11.75                                   false   False
2006-05-06 16:01:01.000 3.00                                    11.75                                   F       False
2004-10-06 10:01:01.000 10.00                                   11.75                                   0       False
2005-11-06 10:01:01.000 9.00                                    11.75                                   False   False
2006-06-06 17:01:01.000 2.00                                    11.75                                   True    True
2006-01-06 12:01:01.000 7.00                                    11.75                                   Yesw    True
2006-02-06 13:01:01.000 6.00                                    11.75                                   Y       True
2005-03-06 14:01:01.000 5.00                                    11.75                                   yes     True
2006-10-06 10:01:01.000 10.00                                   11.75                                   No      False
2006-10-06 10:01:01.000 3.00                                    11.75                                   N       False
2006-10-06 10:01:01.000 10.00                                   11.75                                   n       False
2004-03-06 14:01:01.000 5.00                                    11.75                                   -1      False
2005-04-06 15:01:01.000 4.00                                    11.75                                   NULL    False
2005-05-06 16:01:01.000 3.00                                    11.75                                   NULL    False
2006-07-06 19:01:01.000 1.00                                    11.75                                   1       True
2006-03-06 14:01:01.000 5.00                                    11.75                                   NULL    False
2006-04-06 15:01:01.000 4.00                                    11.75                                   NULL    False
2006-06-06 17:01:01.000 2.00                                    11.75                                   NULL    False
2007-05-07 11:30:00.000 2.00                                    10.50                                   NULL    False
2007-05-08 13:30:00.000 1.00                                    10.00                                   NULL    False
2006-07-06 19:01:01.000 1.00                                    11.75                                   NULL    False
2007-05-09 14:00:00.000 1.25                                    10.00                                   2       False
2007-11-06 10:01:01.000 9.00                                    11.75                                   NULL    False
2007-05-10 14:00:00.000 5.00                                    10.00                                   T       True
2007-05-11 14:15:00.000 4.00                                    10.00                                   F       False
2007-05-12 15:00:00.000 2.00                                    10.00                                   false   False
2007-05-13 16:00:00.000 1.00                                    10.00                                   0       False

(32 row(s) affected)

There are a few assumptions:

  1. If it is not defined as true, then it must be false. This means that a NULL will mean False or an abc will also mean False.
  2. I only look at the 1st uppered [just created a brand new word] character: Line 2: case when charindex(left(upper(logical), 1), 'T1Y') > 0: If the 1st uppered character is a: T or 1 or Y, then it's true.
  3. You can do the same thing to update or to convert the boolean column to 1 or 0 with:
  1. UPDATE sales02
  2. SET logical = CASE WHEN CHARINDEX(LEFT(UPPER(logical), 1), 'T1Y') > 0
  3.                    THEN 1
  4.                    ELSE 0
  5. END