繁体   English   中英

SQL:条件where子句不起作用

[英]SQL: Conditional where clause not working

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

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

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

任何帮助将不胜感激。

试试这个-

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)

您的意思是,如果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匹配,并且将被忽略。

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

你快到了,将''替换为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,因为这是标准的查询惯例,cheer =)

(@EmlAdd is null or CONTACT_VALUE =@EmlAdd)
or
(@MblNum is null or CONTACT_VALUE = @MblNum)

因为您只搜索单个数据列,所以不必太聪明...除非您忽略了提供其他相关信息。

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
;
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)

)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM