在MSSQL中查询键值对数据库

时间:2018-12-19 08:19:15

标签: sql-server database

我在MSSQL中有一个表在metakey-value对上,如果提供了meta值,那么用来选择所有不同的CustomerID的最佳功能是什么?

这是我当前的脚本。

DECLARE
    @name NVARCHAR(100) = 'Brian',
    @mobile NVARCHAR(100) = '0219002315'
SELECT cd.CustomerID FROM [dbo].[CustomerDetails] cd
 where (cd.MetaKey='First Name' AND cd.MetaValue=@name ) 
   or (cd.MetaKey='Mobile' AND cd.MetaValue=@mobile) 
group by cd.CustomerID
having count(*) = 2

所以,我要实现的目标是,如果我具有@name的值,那么我将获得那些元值= @name的客户,如果同时提供了@name和@mobile,我将仅获得那些都满足。目前,我的问题是,如果@mobile或@name为null,则不会得到任何值。

我的表格是[dbo]。[CustomerDetails]。具有以下列: CustomerDetailsID 客户ID 元密钥 MetaValue

2 个答案:

答案 0 :(得分:0)

您正在使用COUNT(*)= 2的子句。因此,如果只有其中之一匹配,则不会得到任何行。您需要删除它。

DECLARE
    @name NVARCHAR(100) = 'Brian',
    @mobile NVARCHAR(100) = '0219002315'
SELECT cd.CustomerID FROM [dbo].[CustomerDetails] cd
 where (cd.MetaKey='First Name' AND cd.MetaValue=@name ) 
   or (cd.MetaKey='Mobile' AND cd.MetaValue=@mobile) 
group by cd.CustomerID

答案 1 :(得分:0)

您希望更多的客户使用唯一的手机号码和名字吗? 如果没有,您可以使用以下方法

SELECT distinct cd.CustomerID 
FROM [dbo].[CustomerDetails] cd
where (cd.MetaKey='First Name' AND cd.MetaValue=@name ) 
   or (cd.MetaKey='Mobile' AND cd.MetaValue=@mobile)