【问题标题】:MySQL Wildcard for "=" - is there one“=”的MySQL通配符 - 有没有
【发布时间】:2010-10-22 16:59:11
【问题描述】:

所以,

SELECT * FROM table WHERE col LIKE '%'

将返回所有内容。查询是否有通配符

SELECT * FROM table WHERE col = '*'

显然* 不起作用,我只是把它放在那里表示我想要通配符的位置。我从中选择的列包含一个介于 1 和 12 之间的整数,我希望能够选择具有特定数字的所有记录,或具有通配符的所有记录。

谢谢,

【问题讨论】:

    标签: mysql wildcard


    【解决方案1】:

    使用 LIKE 的原因是因为 = 不提供通配符支持。否则就没有LIKE的理由

    【讨论】:

      【解决方案2】:
      SELECT * FROM table WHERE col RLIKE '.*'
      

      即正则表达式 LIKE。

      【讨论】:

      【解决方案3】:

      如果您想选择所有内容,为什么要附加 WHERE 子句?只需有条件地将其关闭,而不是将通配符放入其中。

      【讨论】:

      • 我在想,然后我想,不,这很荒谬,他一定只是在使用通配符作为示例,实际上他会将文本锚定在它的一侧或两侧。然后我详细重新阅读了这个问题,不,你是对的,他只需要在他的申请中留下 WHERE。
      • Dan,你知道 WHERE 部分是可选的,对吧?如果您将其关闭,那么您将选择每一行。
      • 相反,如果你这样做的话,有一个可选的参数会更容易。您可以准备单个语句,如果不需要约束,只需将 % 传递给 execute()(对于 PDO)。如果有约束,它的工作原理与 = 相同。这使我的代码更加简洁,因为从 php7 开始,我可以这样做$stmt->execute([$args['class'] ?? '%']);,而不是准备两个单独的大 'ole 查询!
      【解决方案4】:

      假设您的查询是参数驱动的,case 语句可能是合适的

      select * from mytable
      where col like case when @myvariable is null then % else myvariable end
      

      如果您不想要一个值,@myvariable 为 null,否则它将使用您传入的整数值。

      【讨论】:

        【解决方案5】:

        LIKE 与 = 基本相同,只是 LIKE 允许您使用通配符。

        这两个查询将返回相同的结果:

        SELECT * FROM table WHERE col LIKE 'xyz';
        SELECT * FROM table WHERE col='xyz';
        

        LIKE 查询中没有“%”,它实际上与“=”相同。

        如果您在整数列上进行选择,您应该考虑使用 IN() 或 BETWEEN 运算符。听起来您有两个单独的条件应该在代码中处理,而不是在查询中处理,因为您的条件要求您至少需要两种不同类型的查询。

        编辑:我应该澄清 LIKE 和 = 仅在正常的、单调的字符串比较用法中相似。您应该查看 MySQL Manual 以了解其工作原理的详细信息,因为在某些情况下它不一样(例如语言集)。

        【讨论】:

        • 谢谢,正是我想要的。将在代码中处理它,并在需要时更改查询以包含特定的 WHERE 子句。
        • MySQL 是否支持 BETWEEN?我以为那只是 TSQL
        • @Joe:BETWEEN 是标准 SQL。我从来没有遇到过任何支持不支持 BETWEEN 的 SQL 的系统。
        【解决方案6】:

        zombat 的回答很棒,但我只在他的回答中注意到您正在选择整数。他提到了 IN() 和 BETWEEN()。下面是使用这些语法的示例,以及整数字段的其他一些选项。

        SELECT * FROM table WHERE col = 1;
        SELECT * FROM table WHERE col BETWEEN 1 AND 12;
        SELECT * FROM table WHERE col BETWEEN 6 AND 12;
        SELECT * FROM table WHERE col <= 6;
        SELECT * FROM table WHERE col < 6;
        SELECT * FROM table WHERE col >= 6;
        SELECT * FROM table WHERE col > 6;
        SELECT * FROM table WHERE col <> 6;
        SELECT * FROM table WHERE col IN (1,2,5,6,10);
        SELECT * FROM table WHERE col NOT IN (1,2,5,6,10);
        

        【讨论】:

          【解决方案7】:

          我在为报表构建存储过程时遇到过这种情况 以下是我的解决方案,希望这是您的想法:)

          set @p = "ALL";
          

          查询:

          select * from fact_orders
          where
          dim_country_id = if(@p is null or @p="ALL", dim_country_id, @p)
          limit 10
          ;
          

          【讨论】:

            【解决方案8】:

            如果您的值在 (1,12) 范围内,则:

            从 col>=5 和 col

            从 col>=0 和 col

            通过适当地选择 2 个参数,同一行可以产生两种效果。 当我需要一个准备好的语句时,我遇到了类似的问题,它应该以两种不同的方式工作,要么检查列中的特定值,要么完全忽略该列。

            【讨论】:

              猜你喜欢
              • 2021-09-17
              • 1970-01-01
              • 2013-08-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多