Помимо подстановочных знаков, разница между =
И 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".