更新:我们被告知可能不会提供这两个参数的值。在这种情况下,手机号码和电子邮件地址都不应有过滤器。
我很难确定我的查询有什么问题。基本上,我有两个变量
@EmlAdd
@MblNum
我想要做的是使用以下规则进行搜索: 两个变量中至少有一个必须有一个值 如果我只提供电子邮件地址的值,则必须忽略手机号码的过滤器 如果我只提供手机号码的值,则必须忽略电子邮件地址的过滤器
到目前为止,我的解决方案正在发生的事情是: 如果提供了2个变量的值:IT工作 如果只有一个变量有价值:不工作
DECLARE
@EmlAdd AS VARCHAR(100),
@MblNum AS VARCHAR(100)
SET @EmlAdd = ''
SET @MblNum = '5555555'
SELECT
USER_ID,
CONTACT_VALUE
FROM
TBL_CONTACTS
WHERE
(
(CONTACT_VALUE = @MblNum OR @MblNum = '')
OR
(CONTACT_VALUE = @EmlAdd OR @EmlAdd = '')
)
非常感谢任何帮助。
答案 0 :(得分:1)
试试这个 -
DECLARE
@EmlAdd VARCHAR(100)
, @MblNum VARCHAR(100)
SELECT
@EmlAdd = ''
, @MblNum = '5555555'
SELECT [USER_ID], CONTACT_VALUE
FROM dbo.TBL_CONTACTS
WHERE CONTACT_VALUE IN (@MblNum, @EmlAdd)
答案 1 :(得分:0)
你所说的是,如果MblNum为空,或者如果EmlAdd为空,则返回所有内容。
您可能希望将中间OR更改为AND。
WHERE
(
(CONTACT_VALUE = @MblNum OR @MblNum = '')
AND
(CONTACT_VALUE = @EmlAdd OR @EmlAdd = '')
)
这样MblNum必须与CONTACT_VALUE匹配,并且EmlAdd必须匹配或为空,反之亦然。现在,如果你包括两个参数,那么他们都必须匹配和。如果你仍然希望任何一个匹配,那么放弃检查空参数,
WHERE CONTACT_VALUE = @MblNum OR CONTACT_VALUE = @EmlAdd
如果任一参数为空,则它不应与CONTACT_VALUE匹配,将被忽略。
答案 2 :(得分:0)
删除或@MblNum =''和或@EmlAdd =''
当只有一个参数设置了值时,另一个参数将等于''(0长度字符串),因此每次调用都会满足逻辑条件。
DECLARE
@EmlAdd AS VARCHAR(100),
@MblNum AS VARCHAR(100)
SET @EmlAdd = ''
SET @MblNum = '5555555'
SELECT
USER_ID,
CONTACT_VALUE
FROM
TBL_CONTACTS
WHERE
(
(CONTACT_VALUE = @MblNum)
OR
(CONTACT_VALUE = @EmlAdd)
OR
(@EmlAdd='' AND @MblNum='')
)
答案 3 :(得分:0)
你几乎就在那里,将''替换为null
DECLARE @SAMPLE TABLE
(
[USER_ID] INT IDENTITY(1,1),
[CONTACT_VALUE] NVARCHAR(255)
)
INSERT INTO @SAMPLE
VALUES
('5555555'),
('Email@Yahoo.com')
DECLARE
@EmlAdd AS VARCHAR(100),
@MblNum AS VARCHAR(100)
SET @EmlAdd = ''
SET @MblNum = '5555555'
SELECT
USER_ID,
CONTACT_VALUE
FROM
@SAMPLE
WHERE
- 更改在这里,将''替换为null,因为这是标准查询实践,欢呼=)
(@EmlAdd is null or CONTACT_VALUE =@EmlAdd)
or
(@MblNum is null or CONTACT_VALUE = @MblNum)
答案 4 :(得分:0)
因为您只搜索单个数据列,所以您不必非常聪明......除非您忽略了提供其他相关信息。
DECLARE @EmlAdd As varchar(100)
, @MblNum As varchar(100);
SET @EmlAdd = '';
SET @MblNum = '5555555';
/* Optional (recommended)
-- Set values to NULL if blank string is passed
SET @EmlAdd = NullIf(@EmlAdd, '');
SET @MblNum = NullIf(@MblNum, '');
*/
-- If both variables are NULL then no search criteria
IF Coalesce(@EmlAdd, @MblNum) IS NULL THEN
BEGIN
SELECT USER_ID
, CONTACT_VALUE
FROM TBL_CONTACTS;
END
-- At least one variable is not NULL so let's look for it
ELSE
BEGIN
SELECT USER_ID
, CONTACT_VALUE
FROM TBL_CONTACTS
WHERE CONTACT_VALUE IN (@EmlAdd, @MblNum);
END
;
答案 5 :(得分:0)
DECLARE
@EmlAdd AS VARCHAR(100),
@MblNum AS VARCHAR(100)
SET @EmlAdd = ''
SET @MblNum = '5555555'
SELECT USER_ID, CONTACT_VALUE
FROM
TBL_CONTACTS
WHERE
(
(CONTACT_VALUE = case when @MblNum = '' then @EmlAdd else case when @EmlAdd = '' then @MblNum end end)
)