diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.9.2.0
+
+* Added `nullableToMaybeFields` and `maybeFieldsToNullable`
+
 ## 0.9.1.0
 
 * Added `distinctOnExplicit` and `distinctOnByExplicit`
diff --git a/opaleye.cabal b/opaleye.cabal
--- a/opaleye.cabal
+++ b/opaleye.cabal
@@ -1,6 +1,6 @@
 name:            opaleye
 copyright:       Copyright (c) 2014-2018 Purely Agile Limited; 2019-2022 Tom Ellis
-version:         0.9.1.0
+version:         0.9.2.0
 synopsis:        An SQL-generating DSL targeting PostgreSQL
 description:     An SQL-generating DSL targeting PostgreSQL.  Allows
                  Postgres queries to be written within Haskell in a
diff --git a/src/Opaleye/Internal/MaybeFields.hs b/src/Opaleye/Internal/MaybeFields.hs
--- a/src/Opaleye/Internal/MaybeFields.hs
+++ b/src/Opaleye/Internal/MaybeFields.hs
@@ -42,7 +42,9 @@
 
 import qualified Database.PostgreSQL.Simple.FromRow as PGSR
 
--- | The Opaleye analogue of 'Data.Maybe.Maybe'
+-- | The Opaleye analogue of 'Data.Maybe.Maybe'.  A value of type
+-- @MaybeFields a@ either contains a value of type @a@, or it contains
+-- nothing.
 data MaybeFields fields =
   MaybeFields {
     mfPresent :: Opaleye.Column.Column Opaleye.SqlTypes.SqlBool
@@ -105,13 +107,20 @@
 fromMaybeFields :: PP.Default IfPP b b => b -> MaybeFields b -> b
 fromMaybeFields = fromMaybeFieldsExplicit PP.def
 
--- | The Opaleye analogue of 'Data.Maybe.maybeToList'
+-- | The Opaleye analogue of 'Data.Maybe.maybeToList'. Unless you are
+-- using arrow notation you'll probably find 'catMaybeFields' easier
+-- to use.
 maybeFieldsToSelect :: SelectArr (MaybeFields a) a
 maybeFieldsToSelect = proc mf -> do
   restrict -< mfPresent mf
   returnA -< mfFields mf
 
--- | The Opaleye analogue of 'Data.Maybe.catMaybes'
+-- | The Opaleye analogue of 'Data.Maybe.catMaybes'.  Most commonly
+-- you will want to use this at type
+--
+-- @
+-- catMaybeFields :: Select (MaybeFields a) -> Select a
+-- @
 catMaybeFields :: SelectArr i (MaybeFields a) -> SelectArr i a
 catMaybeFields = (>>> maybeFieldsToSelect)
 
@@ -172,6 +181,22 @@
   a <- q -< ()
   restrict -< cond a
   returnA -< a
+
+-- | Convert @NULL@ to 'nothingFields' and non-@NULL@ to a 'justFields'
+nullableToMaybeFields :: Opaleye.Field.FieldNullable a -> MaybeFields (Field a)
+nullableToMaybeFields x = MaybeFields
+  { mfPresent = Opaleye.Internal.Operators.not (Opaleye.Field.isNull x)
+  , mfFields = unsafeFromNonNull x
+  }
+  where unsafeFromNonNull :: Opaleye.Field.FieldNullable a -> Field a
+        unsafeFromNonNull = Opaleye.Field.unsafeCoerceField
+
+-- | Convert 'nothingFields' to @NULL@ to a 'justFields' to non-@NULL@
+maybeFieldsToNullable :: MaybeFields (Field a) -> Opaleye.Field.FieldNullable a
+maybeFieldsToNullable x =
+  IC.unsafeIfThenElse (mfPresent x)
+                      (Opaleye.Field.toNullable (mfFields x))
+                      Opaleye.Field.null
 
 fromFieldsMaybeFields :: RQ.FromFields fields haskells
                       -> RQ.FromFields (MaybeFields fields) (Maybe haskells)
diff --git a/src/Opaleye/MaybeFields.hs b/src/Opaleye/MaybeFields.hs
--- a/src/Opaleye/MaybeFields.hs
+++ b/src/Opaleye/MaybeFields.hs
@@ -7,17 +7,24 @@
 -- 'Opaleye.Join.optionalRestrict' and 'Opaleye.Join.optional'.
 
 module Opaleye.MaybeFields (
+  -- * 'MaybeFields' type
   MaybeFields,
+  -- * Creating a 'MaybeFields'
   nothingFields,
+  nothingFieldsOfTypeOf,
   justFields,
+  nullableToMaybeFields,
+  -- * Using a 'MaybeFields'
   matchMaybe,
   fromMaybeFields,
   maybeFields,
-  maybeFieldsToSelect,
-  nothingFieldsOfTypeOf,
-  catMaybeFields,
+  maybeFieldsToNullable,
+  -- * Creating a 'Select' which returns 'MaybeFields'
   Opaleye.Join.optional,
   Opaleye.MaybeFields.traverseMaybeFields,
+  -- * Using a 'Select' which returns 'MaybeFields'
+  catMaybeFields,
+  maybeFieldsToSelect,
   -- * Adaptors
   Nullspec,
   nullspecField,
