<literal>IS NULL</literal> and <literal>IS NOT NULL</literal> do not always return
inverse results for row-valued expressions; in particular, a row-valued
expression that contains both null and non-null fields will return false
- for both tests. In some cases, it may be preferable to
+ for both tests. For example:
+
+<programlisting>
+SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same');
+
+SELECT ROW(table.*) IS NULL FROM table; -- detect all-null rows
+
+SELECT ROW(table.*) IS NOT NULL FROM table; -- detect all-non-null rows
+
+SELECT NOT(ROW(table.*) IS NOT NULL) FROM TABLE; -- detect at least one null in rows
+</programlisting>
+
+ In some cases, it may be preferable to
write <replaceable>row</replaceable> <literal>IS DISTINCT FROM NULL</literal>
or <replaceable>row</replaceable> <literal>IS NOT DISTINCT FROM NULL</literal>,
which will simply check whether the overall row value is null without any
<para>
Row constructors can be used to build composite values to be stored
in a composite-type table column, or to be passed to a function that
- accepts a composite parameter. Also,
- it is possible to compare two row values or test a row with
- <literal>IS NULL</literal> or <literal>IS NOT NULL</literal>, for example:
-<programlisting>
-SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same');
-
-SELECT ROW(table.*) IS NULL FROM table; -- detect all-null rows
-</programlisting>
- For more detail see <xref linkend="functions-comparisons"/>.
- Row constructors can also be used in connection with subqueries,
- as discussed in <xref linkend="functions-subquery"/>.
+ accepts a composite parameter. Also, it is possible to test rows
+ using the standard comparison operators as described in <xref
+ linkend="functions-comparison"/>, to compare one row against another
+ as described in <xref linkend="functions-comparisons"/>, and to
+ use them in connection with subqueries, as discussed in <xref
+ linkend="functions-subquery"/>,
</para>
</sect2>