Equals(=) vs. LIKE

后端 未结 15 2274
情书的邮戳
情书的邮戳 2020-11-22 15:19

When using SQL, are there any benefits of using = in a WHERE clause instead of LIKE?

Without any special operators, LIKE

15条回答
  •  日久生厌
    2020-11-22 15:35

    Besides the wildcards, the difference between = AND LIKE will depend on both the kind of SQL server and on the column type.

    Take this example:

    CREATE TABLE testtable (
      varchar_name VARCHAR(10),
      char_name CHAR(10),
      val INTEGER
    );
    
    INSERT INTO testtable(varchar_name, char_name, val)
        VALUES ('A', 'A', 10), ('B', 'B', 20);
    
    SELECT 'VarChar Eq Without Space', val FROM testtable WHERE varchar_name='A'
    UNION ALL
    SELECT 'VarChar Eq With Space', val FROM testtable WHERE varchar_name='A '
    UNION ALL
    SELECT 'VarChar Like Without Space', val FROM testtable WHERE varchar_name LIKE 'A'
    UNION ALL
    SELECT 'VarChar Like Space', val FROM testtable WHERE varchar_name LIKE 'A '
    UNION ALL
    SELECT 'Char Eq Without Space', val FROM testtable WHERE char_name='A'
    UNION ALL
    SELECT 'Char Eq With Space', val FROM testtable WHERE char_name='A '
    UNION ALL
    SELECT 'Char Like Without Space', val FROM testtable WHERE char_name LIKE 'A'
    UNION ALL
    SELECT 'Char Like With Space', val FROM testtable WHERE char_name LIKE 'A '
    
    • Using MS SQL Server 2012, the trailing spaces will be ignored in the comparison, except with LIKE when the column type is VARCHAR.

    • Using MySQL 5.5, the trailing spaces will be ignored for =, but not for LIKE, both with CHAR and VARCHAR.

    • Using PostgreSQL 9.1, spaces are significant with both = and LIKE using VARCHAR, but not with CHAR (see documentation).

      The behaviour with LIKE also differs with CHAR.

      Using the same data as above, using an explicit CAST on the column name also makes a difference:

      SELECT 'CAST none', val FROM testtable WHERE char_name LIKE 'A'
      UNION ALL
      SELECT 'CAST both', val FROM testtable WHERE
          CAST(char_name AS CHAR) LIKE CAST('A' AS CHAR)
      UNION ALL
      SELECT 'CAST col', val FROM testtable WHERE CAST(char_name AS CHAR) LIKE 'A'
      UNION ALL
      SELECT 'CAST value', val FROM testtable WHERE char_name LIKE CAST('A' AS CHAR)
      

      This only returns rows for "CAST both" and "CAST col".

提交回复
热议问题