【问题标题】:How do I add multiple "NOT LIKE '%?%' in the WHERE clause of sqlite3?如何在 sqlite3 的 WHERE 子句中添加多个“NOT LIKE '%?%'?
【发布时间】:2011-11-11 02:48:03
【问题描述】:

我有一个 sqlite3 查询,例如:

SELECT word FROM table WHERE word NOT LIKE '%a%';

这将选择单词中没有出现“a”的所有单词。这我可以完美地工作。问题是如果我想进一步限制结果不包括单词中的任何地方的“b”。我正在想象这样的事情。

SELECT word FROM table WHERE word NOT IN ('%a%', '%b%', '%z%');

这显然行不通,但这就是想法。只是添加一个AND 子句是我试图避免的:

SELECT word FROM table WHERE word NOT LIKE '%a%' AND NOT LIKE '%b%';

如果这是唯一的选择,那么我将不得不使用它,但我希望有别的选择。

【问题讨论】:

  • 据我了解,它确实是 sqlite3。我在 python 中使用 sqlite3 模块。不是 sqlite 或 sql ......但我可能弄错了。

标签: sql sqlite


【解决方案1】:
SELECT word FROM table WHERE word NOT LIKE '%a%' 
AND word NOT LIKE '%b%' 
AND word NOT LIKE '%c%';

【讨论】:

  • D'oh,我刚刚犯了这个错误。感谢您发现真正的问题:省略 LIKE 运算符的左操作数。并感谢 OP 减少了尴尬。
【解决方案2】:

如果您使用 Sqlite 的 REGEXP 支持(请参阅Problem with regexp python and sqlite 的答案了解如何做到这一点),那么您可以在一个子句中轻松完成:

SELECT word FROM table WHERE word NOT REGEXP '[abc]';

【讨论】:

  • 为了澄清对正则表达式不太熟悉的用户,它可能类似于 'table' NOT REGEXP 'word1|word2|word3|word4|word5';等
【解决方案3】:

您错过了第二个陈述:1) NOT LIKE A, AND 2) NOT LIKE B

SELECT word FROM table WHERE word NOT LIKE '%a%' AND word NOT LIKE '%b%'

【讨论】:

    【解决方案4】:

    这是一个选择命令

       FROM
        user
    WHERE
        application_key = 'dsfdsfdjsfdsf'
            AND email NOT LIKE '%applozic.com'
            AND email NOT LIKE '%gmail.com'
            AND email NOT LIKE '%kommunicate.io';
    

    这个更新命令

     UPDATE user
        SET email = null
        WHERE application_key='dsfdsfdjsfdsf' and  email not like '%applozic.com' 
        and email not like '%gmail.com'  and email not like '%kommunicate.io';
    

    【讨论】:

      【解决方案5】:

      我不确定您为什么要避免 AND 子句。这是最简单的解决方案。

      否则,您需要执行多个查询的INTERSECT

      SELECT word FROM table WHERE word NOT LIKE '%a%'
      INTERSECT
      SELECT word FROM table WHERE word NOT LIKE '%b%'
      INTERSECT
      SELECT word FROM table WHERE word NOT LIKE '%c%';
      

      如果您的 SQL 版本支持,您也可以使用正则表达式。

      【讨论】:

      • 他可能避免使用 AND 子句,因为它使查询变得如此冗长。 SQL 中应该有一些特性可以将多个值组合到一个列表 a la NOT IN 中,这样我们只需要编写一次 <value> NOT LIKE ,然后是要比较的值列表。这是一个合理的愿望,令人惊讶的是 SQL 没有针对这种情况的这样一个功能。
      • @TylerH 对于这样的事情,一般来说很难谈论“SQL”。例如,PostgreSQL 对此有 op any(array[...]) and op all(array[...]) 构造(使用 in (list)not in (list) being special cases of =any` 和 <> all),其他 SQL 方言的做法不同。对于正则表达式和“标准”similar to 模式匹配运算符也是如此。
      【解决方案6】:

      你要查询的是

      SELECT word FROM table WHERE word NOT LIKE '%a%' AND word NOT LIKE '%b%'
      

      【讨论】:

        【解决方案7】:

        如果您对“不喜欢”查询有任何问题, 考虑到您可能在数据库中有一个空值。在这种情况下,使用:

        IFNULL(word, '') NOT LIKE '%something%'
        

        【讨论】:

          【解决方案8】:

          试试下面对我有用的查询。

          SELECT word FROM table WHERE  NOT (word LIKE '%a%' AND word LIKE '%b%');
          

          【讨论】:

            【解决方案9】:

            答案:正则表达式

            正则表达式又名正则表达式 (regexp) 非常强大,几乎被所有流行的编程语言使用。
            使用它,您可以在几次击键中找到多个模式,而不是多个 AND、OR 语句。

            上述解决方案的简单正则表达式:

            SELECT word FROM table WHERE word REGEXP '^[a-zA-Z]*[^abz][a-zA-Z]*$';
            

            这里:

            ^ 表示文本的开头
            [a-zA-Z] 表示可以出现任意一个字符(大写/小写)
            @ 987654325@ 表示前面的任何内容都可以重复 0 次或多次
            [^abz] 表示除了这三个字符之外,任何其他字符都可以出现 - 只有单个字符
            $代表文本的结尾

            找到一个很好的示例列表here

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-03-03
              • 1970-01-01
              • 2021-05-23
              • 2020-10-27
              • 1970-01-01
              • 1970-01-01
              • 2019-05-18
              • 2015-01-23
              相关资源
              最近更新 更多