0

更新:我们被告知可能不会提供这两个参数的值。在这种情况下,不应同时过滤手机号码和电子邮件地址。

我很难确定我的查询有什么问题。基本上,我有两个变量

@EmlAdd
@MblNum

我想要做的是使用以下规则进行搜索:两个变量中的至少一个必须有一个值如果我只提供电子邮件地址的值,它必须忽略手机号码的过滤器如果我只提供手机号码的值,它必须忽略电子邮件地址的过滤器

到目前为止,我的解决方案发生的情况是:如果提供了 2 个变量的值:如果只有一个变量具有值,则它可以工作:不工作

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 = '')
)

任何帮助将不胜感激。

4

6 回答 6

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)
于 2013-09-25T06:43:26.213 回答
0

您要说的是,如果 MblNum 为空白或 EmlAdd 为空白,则返回所有内容。

您可能希望将中间的 OR 更改为 AND。

WHERE
(
    (CONTACT_VALUE = @MblNum OR @MblNum = '')
        AND
    (CONTACT_VALUE = @EmlAdd OR @EmlAdd = '')
)

这样 MblNum 必须匹配 CONTACT_VALUE 并且 EmlAdd 必须匹配或为空,反之亦然。现在,如果您同时包含这两个参数,那么它们都必须与 and 匹配。如果您仍然希望其中任何一个匹配,请放弃对空参数的检查,

WHERE CONTACT_VALUE = @MblNum OR CONTACT_VALUE = @EmlAdd

如果任一参数为空,则不应匹配 CONTACT_VALUE 并将被忽略。

于 2013-09-25T04:09:42.853 回答
0

删除OR @MblNum = ''OR @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='')
)
于 2013-09-25T05:39:43.107 回答
0

你快到了,将''替换为空

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

--更改在这里,将''替换为空,因为这是标准查询实践,欢呼=)

(@EmlAdd is null or CONTACT_VALUE =@EmlAdd)
or
(@MblNum is null or CONTACT_VALUE = @MblNum)
于 2013-09-25T06:18:15.920 回答
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
;
于 2013-09-25T14:35:25.280 回答
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)

)
于 2013-10-02T09:26:11.017 回答