Равно (=) против LIKE - PullRequest
       40

Равно (=) против LIKE

261 голосов
/ 13 февраля 2009

При использовании SQL, есть ли преимущества использования = в предложении WHERE вместо LIKE?

Без каких-либо специальных операторов LIKE и = одинаковы, верно?

Ответы [ 15 ]

4 голосов
/ 11 ноября 2012

Помимо подстановочных знаков, разница между = И LIKE будет зависеть как от типа сервера SQL, так и от типа столбца.

Возьмите этот пример:

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 '
  • При использовании MS SQL Server 2012 конечные пробелы при сравнении будут игнорироваться, за исключением LIKE, когда тип столбца VARCHAR.

  • При использовании MySQL 5.5 завершающие пробелы будут игнорироваться для =, но не для LIKE, как для CHAR, так и VARCHAR.

  • При использовании PostgreSQL 9.1 пробелы значимы как для =, так и LIKE для VARCHAR, но не для CHAR (см. Документацию ).

    Поведение с LIKE также отличается с CHAR.

    Использование тех же данных, что и выше, использование явного CAST в имени столбца также имеет значение :

    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)
    

    Возвращает только строки для "CAST both" и "CAST col".

2 голосов
/ 13 февраля 2009

К ключевому слову LIKE, несомненно, прилагается «ценник эффективности». Тем не менее, если у вас есть поле ввода, которое потенциально может содержать символы подстановки, которые будут использоваться в вашем запросе, я бы рекомендовал использовать LIKE , только если , вход содержит один из символов подстановки. В противном случае используйте стандарт, равный сравнению.

С наилучшими пожеланиями ...

1 голос
/ 03 сентября 2011

В Oracle «like» без подстановочных знаков вернет тот же результат, что и «equals», но может потребовать дополнительной обработки. По словам Тома Кайта , Oracle будет воспринимать «как» без подстановочных знаков как «равно» при использовании литералов, но не при использовании переменных связывания.

1 голос
/ 13 февраля 2009

На самом деле все сводится к тому, что вы хотите сделать запрос. Если вы имеете в виду точное совпадение, используйте =. Если вы имеете в виду нечеткое совпадение, используйте LIKE. Сказать, что вы имеете в виду, обычно хорошая политика с кодом.

0 голосов
/ 13 февраля 2009

= и LIKE - это не одно и то же;

  1. = соответствует точной строке
  2. LIKE соответствует строке, которая может содержать символы подстановки (%)
...