Index: src/main/org/h2/expression/Function.java
===================================================================
--- src/main/org/h2/expression/Function.java	(revision 3611)
+++ src/main/org/h2/expression/Function.java	(working copy)
@@ -1691,12 +1691,27 @@
             break;
         }
         case CASEWHEN:
-        case NVL2:
             t = Value.getHigherOrder(args[1].getType(), args[2].getType());
             p = Math.max(args[1].getPrecision(), args[2].getPrecision());
             d = Math.max(args[1].getDisplaySize(), args[2].getDisplaySize());
             s = Math.max(args[1].getScale(), args[2].getScale());
             break;
+        case NVL2:
+            switch (args[1].getType()) {
+            case Value.STRING:
+            case Value.CLOB:
+            case Value.STRING_FIXED:
+            case Value.STRING_IGNORECASE:
+                t = args[1].getType();
+                break;
+            default:
+                t = Value.getHigherOrder(args[1].getType(), args[2].getType());
+                break;
+            }
+            p = Math.max(args[1].getPrecision(), args[2].getPrecision());
+            d = Math.max(args[1].getDisplaySize(), args[2].getDisplaySize());
+            s = Math.max(args[1].getScale(), args[2].getScale());
+            break;
         case CAST:
         case CONVERT:
         case TRUNCATE_VALUE:
Index: src/test/org/h2/test/db/TestFunctions.java
===================================================================
--- src/test/org/h2/test/db/TestFunctions.java	(revision 3611)
+++ src/test/org/h2/test/db/TestFunctions.java	(working copy)
@@ -111,6 +111,13 @@
         } catch (SQLException e) {
             assertEquals(ErrorCode.DATA_CONVERSION_ERROR_1, e.getErrorCode());
         }
+        
+        //nvl2 should return expr2's datatype, if expr2 is character data.
+        rs = stat.executeQuery("SELECT NVL2(1, 'test', 123), 'test' FROM dual");
+        rs.next();
+        actual = rs.getString(1);
+        assertEquals("test", actual);
+        assertEquals(rs.getMetaData().getColumnType(2), rs.getMetaData().getColumnType(1));
 
         conn.close();
     }
