代码之家  ›  专栏  ›  技术社区  ›  Yoni

在SQL查询中,%%%的含义是什么?

sql
  •  3
  • Yoni  · 技术社区  · 15 年前

    我熟悉这种问题:

    select * from tableA where foo like '%bar%'
    

    但是今天我在一些遗留代码中遇到了三个相邻的百分比符号,比如:

    select * from tableA where foo like '%%%'
    

    当foo是字符串类型(varchar等)时,这个查询在mssql和oracle上都可以工作,但当foo是数字时失败。

    知道这是什么意思吗?

    编辑:对于原始问题中的拼写错误,很抱歉,查询使用like运算符。

    6 回复  |  直到 10 年前
        1
  •  5
  •   Robert Gowland    15 年前

    在MySQL中,它与所有东西都匹配:

    mysql> create database foo;
    Query OK, 1 row affected (0.06 sec)
    
    mysql> use foo;
    Database changed
    
    mysql> create table foo ( bar char(20) );
    Query OK, 0 rows affected (0.06 sec)
    
    mysql> desc foo;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | bar   | char(20) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    mysql> insert into foo values ('endwith%');
    Query OK, 1 row affected (0.05 sec)
    
    mysql> insert into foo values ('%startwith');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into foo values ('cont%ins');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into foo values ('doesnotcontain');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from foo where bar like '%%%';
    +----------------+
    | bar            |
    +----------------+
    | endwith%       |
    | %startwith     |
    | cont%ins       |
    | doesnotcontain |
    +----------------+
    4 rows in set (0.00 sec)
    
        2
  •  4
  •   AdaTheDev    15 年前

    如果您试图查找包含百分比的任何值,则需要使用Escape:

    例如

    SELECT * 
    FROM SomeTable
    WHERE foo LIKE '%|%%' ESCAPE '|'
    

    如果foo是数值(在数据类型中),那么如果尝试将列中的数值与字符串进行比较,则会出现错误。

        3
  •  1
  •   Daniel Luca CleanUnicorn    15 年前
    select * from tableA where foo='%%%'
    

    等于

    select * from tableA where foo='%'
    

    这和

    ls *
    

    ls **
    

    这意味着它可以匹配任何东西。 在这个例子中: 对于MySQL,“%”匹配所有内容 对于ls“*”匹配所有内容

    如果你加2%就等于1。

    mysql> create table foo ( bar char(20) );
    Query OK, 0 rows affected (0.06 sec)
    
    mysql> desc foo;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | bar   | char(20) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    mysql> insert into foo values ('endwith%');
    Query OK, 1 row affected (0.05 sec)
    
    mysql> insert into foo values ('%startwith');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into foo values ('cont%ins');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into foo values ('doesnotcontain');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from foo where bar like '%%%';
    +----------------+
    | bar            |
    +----------------+
    | endwith%       |
    | %startwith     |
    | cont%ins       |
    | doesnotcontain |
    +----------------+
    4 rows in set (0.00 sec)
    
        4
  •  0
  •   zendar    15 年前

    在SQL中“%”和“'(下划线符号)是通配符。
    '%' 替换任意数量的字符-相当于 '*' 在Linux/Unix和Windows文件搜索中。
    '_' 替换一个字符-等同于 '?' 在Linux/Unix和Windows文件搜索中。

    如前所述,一个“%”相当于任意数量的连续“%”,因此在查询中可以替换 '%%%' 具有 “%”

        5
  •  -2
  •   shahkalpesh    15 年前

    您是否希望它与数字类型一起工作,特别是当您传入一个字符串来比较字段时?

    另外,foo存储在哪个字段中?

    通常是 LIKE 在进行通配符比较时使用子句。但是,从您的示例中,DB似乎有一个字段存储通配符条件。而且,%%似乎意味着-任何只包含%%作为其值的东西(特别是当你把它与=符号比较时)。

    伊迪丝2:如果我猜对了, LIKE '%%%' 可能意味着任何包含%字符的内容。

        6
  •  -2
  •   Yoni    10 年前

    我们在使用诸如like之类的运算符比较字符串时用引号编写字符串: select * from emp where ename like 'KING';

    对于数值比较,我们不将值放在引号中,而是使用逻辑运算符,例如=: select * from emp where deptno = 20;