I’m trying to write a lookup method for determining a SMS message to send to a user based on a few parameters associated with the user/system. We will have a default message that will be used as a last resort, but there are multiple ways to override the message by various parameters. Here is what I have so far for the lookup query – are there any better ways to do this? Maybe a lookup is not the right approach for this?
Here is the lookup table:
MessageLookup { ID bigint PK Key varchar CampaignTypeID bigint FK, ServiceProviderID bigint FK nullable, -- optional override parameter DistributorID bigint FK nullable, -- optional override parameter CampaignID bigint FK nullable, -- optional override parameter Message varchar }
Here is an example of what the table would look like:
ID Key CTID SPID DistID CampID Message 1 Help 1 NULL NULL NULL 'This is the default message' 2 Help 1 375 NULL NULL 'This is the SP375 message' 3 Help 1 377 NULL NULL 'This is the SP377 message' 4 Help 1 NULL 13 NULL 'This is the Dist13 message' 5 Help 1 375 13 NULL 'This is the SP375/Dist13 message' 6 Help 1 NULL 13 500 'This is the Dist13/Camp500 message' 7 Help 1 375 13 500 'This is the SP375/Dist13/Camp500 msg' 8 Help 1 NULL NULL 500 'This is the Camp500 help message'
Here is the query I have:
select --top 1 * from MessageLookup ml where ml.[Key] = @Key and ml.CampaignTypeID = @CampaignTypeID and ( ml.ServiceProviderID = @ServiceProviderID or ml.ServiceProviderID is null ) and ( ml.DistributorID = @DistributorID or ml.DistributorID is null ) and ( ml.CampaignID = @CampaignID or ml.CampaignID is null ) order by CampaignID desc, -- highest precedence lookup param DistributorID desc, ServiceProviderID desc -- lowest precedence lookup param
I’m not sure what the best way is, but here are some alternatives:
One thought would be to store a pattern with each rule, like so:
and then use a LIKE test instead of all the ANDs.
Another thought would be to use OUTER JOINS.
Or (playing off the answer that just came in) to DRY things up further by writing: