Sadly this feature is not currently supported so only the workarounds you list above exist.
"Null values in the corresponding fields of two records will be considered a match"
sources:
http://technet.microsoft.com/en-us/library/hh213071.aspx
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/7b52419c-0bb8-4e56-b920-e68ff551bd76/can-i-set-a-matching-rule-to-only-match-if-the-value-is-not-null?forum=sqldataqualityservices
A note when implementing any workaround - the performance will be negatively impacted. You will notice this more with larger data sets.
FWIW The workaround I implemented:
- save matching results to a table, include a column isMatchingScoreAdjusted default 0
- find all records that have a null match and calculate adjusted value
- update results
example proc
DECLARE @GIVEN_NAME FLOAT = 22;
WITH adjustedscore
AS (
SELECT c.MatchingScore
+ case when p.GIVEN_NAME is null and c.GIVEN_NAME is null then -@GIVEN_NAME else 0 end
as [AdjustedMatchingScore]
,c.RecordId
FROM [dbo].[dqs_matches] p
INNER JOIN [dbo].[dqs_matches] c ON c.SiblingId = p.RecordId
WHERE c.IsPivot = 0
AND p.GIVEN_NAME IS NULL
AND c.GIVEN_NAME IS NULL
)
UPDATE m SET MatchingScore = a.AdjustedMatchingScore, isMatchingScoreAdjusted = 1
FROM adjustedscore a
INNER JOIN [dbo].[dqs_matches] m ON m.RecordId = a.RecordId
where m.isMatchingScoreAdjusted = 0