【问题标题】:SQL AND operator logicSQL AND 运算符逻辑
【发布时间】:2012-07-11 19:57:48
【问题描述】:

我的逻辑是错误的。我一生的故事。无论如何,我有以下查询,我认为在一列中的多个字符串检查期间该查询失败。我希望能够使用 AND 运算符在一列中检查多个字符串。

例如,我想屏蔽此电子邮件“dick1sucker@gmail.com”,但不想屏蔽“dickeynewman@gmail.com”。使用下面的AND 运算符,如果发生任何一个字符串检查,就好像一条记录被抑制了,即使我已经用括号括住了语句。

/****** Script for CHECK DOMAIN SUFFIX AND VULGARITIES  ******/

SELECT EMAIL

INTO Matched_Table

FROM Matched_Table_TEMP

WHERE (RIGHT(RTRIM(EMAIL),4) IN ('.COM','.NET','.MIL','.GOV','.ORG','.BIZ') OR RIGHT(RTRIM(EMAIL),3) = '.US')

AND (CHARINDEX('DICK',EMAIL) = 0 and CHARINDEX('SUCKER',EMAIL) = 0)

AND (CHARINDEX('DICK',EMAIL) = 0 and CHARINDEX('HEAD',EMAIL) = 0)

AND (CHARINDEX('DICK',EMAIL) = 0 and CHARINDEX('CHOKE',EMAIL) = 0)

AND (CHARINDEX('DICK',EMAIL) = 0 and CHARINDEX('FACE',EMAIL) = 0)

AND (CHARINDEX('DICK',EMAIL) = 0 and CHARINDEX('NOSE',EMAIL) = 0)

AND (CHARINDEX('COCK',EMAIL) = 0 and CHARINDEX('SUCKER',EMAIL) = 0)

我将在列表中添加更多的漏洞,但显然需要先纠正逻辑。

另一个例子,现在上面禁止了以下电子邮件,但我不希望它们被禁止。

METALHEAD038@HOTMAIL.COM

BAND2FACEDKITTY@AOL.COM

ANGELFACE30_98@YAHOO.COM

TERESADICKSON921@HOTMAIL.COM

ROARINGARTICHOKE@TOMGREEN.COM

CERNOSEK@YAHOO.COM

【问题讨论】:

  • 您是否使用不区分大小写的排序规则?
  • 邓肯,对不起,我应该注意到这一点。我比较的所有数据都是大写的。

标签: sql sql-server-2008


【解决方案1】:

将您所有的内部and(小写字母)更改为or

您的查询正在选择有效地址,因此编写排除项的更自然方式如下:

AND NOT (A != 0 and B != 0)

使用布尔逻辑,要否定p AND q,您需要否定这两个部分并将AND 更改为OR~p OR ~q

在你的情况下:

AND (A = 0 or B = 0)

【讨论】:

  • noa,你的 p 和 q 的布尔逻辑要让我的脑袋爆炸了!这给了我想要的结果。我将不得不在更多的表上进行测试以确保,但到目前为止看起来不错。谢谢,伙计。
  • 通过了所有测试 noa,谢谢。现在我以这种方式看待它,这是有道理的。例如,dickey@aol.com (CHARINDEX('DICK',EMAIL) = 0 OR CHARINDEX('SUCKER',EMAIL) = 0) 第一部分将 = 1,而第二部分将 = 0。 OR 使这个工作,AND 让它失败了。
  • 很高兴这很有意义 - 布尔逻辑几乎总是通过示例更有意义。但是,当你遇到困难时,用英语写出你的提议并正式完成它们通常会有所帮助。如果对您有帮助,请考虑对此和 Aaron 的回答进行投票。
【解决方案2】:

这些都是AND 条件。无论电子邮件的其余部分是什么,您目前根本没有允许包含dick 的电子邮件地址的子句。如果您想允许dick 但不允许dick...head,您需要稍微不同地考虑这一点。例如

DECLARE @Email VARCHAR(255) = 'dickeynewman@gmail.com';

SELECT @Email
WHERE 
(
  RIGHT(RTRIM(@Email),4) IN ('.COM','.NET','.MIL','.GOV','.ORG','.BIZ') 
  OR RIGHT(RTRIM(@Email),3) = '.US'
)
AND 
(
  (@Email NOT LIKE '%DICK%') 
  OR 
  (@Email LIKE '%DICK%' 
    AND @Email NOT LIKE '%SUCKER%'
    AND @Email NOT LIKE '%HEAD%'
    -- ...
  )
)

【讨论】:

  • 我也会看看这个。谢谢,亚伦。
猜你喜欢
  • 1970-01-01
  • 2013-08-14
  • 2016-07-18
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多