@@ -242,6 +242,18 @@ def translate_if_function(
242242 subtree : DBFuncExecNode , exec_context : DBExecContext , base_table : Composable
243243) -> Composable :
244244 children = subtree .children
245+ if isinstance (children [1 ], DBLitExecNode ) and children [1 ].literal == '"NULL"' :
246+ return sql .SQL (
247+ """CASE
248+ WHEN {condition}
249+ THEN NULL
250+ ELSE {false_result}
251+ END"""
252+ ).format (
253+ condition = translate_window_clause (children [0 ], exec_context , base_table ),
254+ false_result = translate_window_clause (children [2 ], exec_context , base_table ),
255+ )
256+
245257 return sql .SQL (
246258 """CASE
247259 WHEN {condition}
@@ -276,6 +288,14 @@ def translate_aggregate_functions(
276288 function = sql .SQL (subtree .function .value ),
277289 agg_column = sql .SQL ("+" ).join (sql .Identifier (col ) for col in child .cols ),
278290 )
291+ elif subtree .function == Function .MAX or subtree .function == Function .MIN :
292+ row_func = "MAX" if subtree .function == Function .MAX else "MIN"
293+ col_func = "GREATEST" if subtree .function == Function .MAX else "LEAST"
294+ agg_sql = sql .SQL ("""{row_func}({col_func}({agg_column}))""" ).format (
295+ row_func = sql .SQL (row_func ),
296+ col_func = sql .SQL (col_func ),
297+ agg_column = sql .SQL ("," ).join (sql .Identifier (col ) for col in child .cols ),
298+ )
279299 elif subtree .function == Function .COUNT :
280300 agg_sql = sql .SQL ("""{num_columns} * {function}({agg_column})""" ).format (
281301 num_columns = sql .Literal (len (child .cols )),
@@ -326,7 +346,30 @@ def translate_aggregate_if_functions(
326346 )
327347 for i in range (len (input_child .cols ))
328348 )
329- )
349+ )
350+ elif subtree .function == Function .MAXIF or subtree .function == Function .MINIF :
351+ row_func = "MAX" if subtree .function == Function .MAXIF else "MIN"
352+ col_func = "GREATEST" if subtree .function == Function .MAXIF else "LEAST"
353+ agg_sql = sql .SQL ("""{row_func}({col_func}({agg_expression}))""" ).format (
354+ row_func = sql .SQL (row_func ),
355+ col_func = sql .SQL (col_func ),
356+ agg_expression = sql .SQL ("," ).join (
357+ sql .SQL (
358+ """
359+ CASE
360+ WHEN {input_col}{condition}
361+ THEN {output_col}
362+ ELSE NULL
363+ END
364+ """
365+ ).format (
366+ input_col = sql .Identifier (input_cols [i ]),
367+ condition = sql .SQL (condition ),
368+ output_col = sql .Identifier (output_cols [i ]),
369+ )
370+ for i in range (len (input_child .cols ))
371+ )
372+ )
330373 elif subtree .function == Function .COUNTIF :
331374 agg_sql = sql .SQL ("""SUM({agg_expression})""" ).format (
332375 agg_expression = sql .SQL ("+" ).join (
0 commit comments