/*  Advanced SQL/Sybase					Fall 2002 */
/*  String, date, convert, and null-handling functions            */
/*								  */ 
/*  Concatenate strings						  */
/*								  */
1> select au_fname + ' ' + au_lname
2> from authors
3> go
                                                               
 ------------------------------------------------------------- 
 Abraham Bennet                                                
 Reginald Blotchet-Halls                                       
 Cheryl Carson                                                 
 ...
 Innes del Castillo                                            

(23 rows affected)

/*  Use convert() to shorten the concatenated strength.		*/
/*  Could have calculated the actual length by finding and 	*/
/*  adding the maximum length of data in each column.		*/
/*								*/
1> select convert(char(30), au_fname + ' ' + au_lname)
2> from authors
3> go
 FullName                       
 ------------------------------ 
 Abraham Bennet                 
 Reginald Blotchet-Halls        
 Cheryl Carson                  
 ...
 Innes del Castillo             

(23 rows affected)

/* Date functions						*/

1> select getdate()
2> go
                            
 -------------------------- 
        Sep 23 2002  6:56PM 

(1 row affected)
1> select datepart(mm, '1/15/2002')
2> go
             
 ----------- 
           1 

(1 row affected)

1> select datename(dw, '12/9/2002')
2> go
                                
 ------------------------------ 
 Monday                         

(1 row affected)

1> select dateadd(dd, 90, getdate())
2> go
                            
 -------------------------- 
        Dec 22 2002  7:00PM 

(1 row affected)

1> select datediff(yy, '7/4/1776', getdate())
2> go
             
 ----------- 
         226 

(1 row affected)

/*  Date formats: convert(char(n), date_expr, style)		*/

1> select convert(char(12), getdate(), 101)
2> go
              
 ------------ 
 09/23/2002   

(1 row affected)
1> select convert(char(12), getdate(), 8)
2> go
              
 ------------ 
 19:15:07     

(1 row affected)
1> select convert(char(24), getdate(), 109) -- not enough chars!
2> go
                          
 ------------------------ 
 Sep 23 2002  7:15:53:733 

(1 row affected)

1> select convert(char(28), getdate(), 109)
2> go
                              
 ---------------------------- 
 Sep 23 2002  7:16:23:626PM   

(1 row affected)

/*  Show how Sybase converts 2-digit year to 4-digit year.	*/

1> select convert(datetime, '1/1/49')
2> go
                            
 -------------------------- 
        Jan  1 2049 12:00AM 

(1 row affected)

1> select convert(datetime, '1/1/50')
2> go
                            
 -------------------------- 
        Jan  1 1950 12:00AM 

(1 row affected)

/*  Examples using isnull, coalesce, and nullif			*/
/*								*/
/*  Use isnull(price, 0) to show null prices as 0, e.g., for	*/
/*  doing calculations.						*/
/*								*/
1> select price from titles -- as is
2> go
 price                    
 ------------------------ 
                    19.99 
                    11.95 
                     2.99 
                    19.99 
                    19.99 
                     2.99 
                     NULL 
                    22.95 
                    20.00 
                     NULL 
                    21.59 
...

(18 rows affected)
1> select isnull(price, 0) NoNulls  -- showing nulls as 0
2> from titles
3> go
 NoNulls                  
 ------------------------ 
                    19.99 
                    11.95 
                     2.99 
                    19.99 
                    19.99 
                     2.99 
                     0.00 
                    22.95 
                    20.00 
                     0.00 
                    21.59 
...

(18 rows affected)

/*  Use coalesce(price, 0) to achieve same result as above.	*/
/*								*/
1> select coalesce(price, 0) NoNulls
2> from titles
3> go
 NoNulls                  
 ------------------------ 
                    19.99 
                    11.95 
                     2.99 
                    19.99 
                    19.99 
                     2.99 
                     0.00 
                    22.95 
                    20.00 
                     0.00 
                    21.59 

...
(18 rows affected)

/* Another example with coalesce, setting to a different value.	*/
/*								*/
1> select advance from titles
2> go
 advance                  
 ------------------------ 
                 5,000.00 
                 5,000.00 
                10,125.00 
                 5,000.00 
                     0.00 
                15,000.00 
                     NULL 
                 7,000.00 
                 8,000.00 
                     NULL 
                 7,000.00 

 ...
(18 rows affected)
1> select coalesce(advance, 3333) from titles
2> go
                          
 ------------------------ 
                 5,000.00 
                 5,000.00 
                10,125.00 
                 5,000.00 
                     0.00 
                15,000.00 
                 3,333.00 
                 7,000.00 
                 8,000.00 
                 3,333.00 
                 7,000.00 
 ...
(18 rows affected)

/*  Example using coalesce with more than one column.		*/
/*  Coalesce finds first non-null column value.			*/
/*								*/
1> use evelyn
2> go

1> select * from grades
2> go
 stuid test1 test2 test3 
 ----- ----- ----- ----- 
     1    75    80    99 
     2  NULL  NULL    80 

(2 rows affected)
1> select stuid, coalesce(test1, test2, test3) from grades
2> go
 stuid     
 ----- --- 
     1  75 
     2  80 

(2 rows affected)
/*								*/
/* Example of nullif:  Set to null if both arguments equal.	*/
/*								*/
1> use pubs2
2> go
1> select title_id, type from titles
2> go
 title_id type         
 -------- ------------ 
 BU1032   business     
 MC3021   mod_cook     
 ...
 MC3026   UNDECIDED    
 ... 
 TC4203   trad_cook    
 TC7777   trad_cook    

(18 rows affected)
1> select title_id, nullif(type, 'UNDECIDED') from titles
2> go
 title_id              
 -------- ------------ 
 BU1032   business     
 MC3021   mod_cook     
 ...
 MC3026   NULL         
 ...
 TC4203   trad_cook    
 TC7777   trad_cook    

(18 rows affected)