Есть ли разница между MYCOLUMN <> '*.*'
и MYCOLUMN <> '*'
Да, вы сравниваете различные текстовые литералы с условием сравнения неравенства .
*
не имеет особого значения. В частности, это , а не подстановочный знак. Из шаблонов это выглядит как возможно ваш столбец содержит имена файлов, и вы выполняете некоторую обработку со значениями позже на уровне ОС, где они могут быть подстановочными знаками. К фактическому запросу они не все же.
<>
совпадает с !=
, поэтому вы ищете либо строки, в которых все содержимое столбца равно , а не буквенная строка '*.*'
в первом случае, либо где все содержимое столбца не является литеральной строкой '*'
во втором. Никакое значение не может соответствовать обоим условиям, кроме нуля. (И нуль на самом деле не совпадает - так как он не равен или и не равен ничему; но результат сравнения «неизвестен», поэтому он не включается в набор результатов) .
В качестве демонстрации:
create table t42(id number, mycolumn varchar2(20));
insert into t42 (id, mycolumn) values (1, '*');
insert into t42 (id, mycolumn) values (2, 'The*is embedded');
insert into t42 (id, mycolumn) values (3, 'The * is embedded');
insert into t42 (id, mycolumn) values (4, '*.*');
insert into t42 (id, mycolumn) values (5, 'The*.*is embedded');
insert into t42 (id, mycolumn) values (6, 'The *.* is embedded');
insert into t42 (id, mycolumn) values (7, 'No asterisk');
insert into t42 (id, mycolumn) values (8, null);
При первом условии исключаются только идентификаторы 3 и 8 (3, потому что условие истинно, 8, потому что оно неизвестно):
select * from t42 where MYCOLUMN <> '*.*';
ID MYCOLUMN
---------- --------------------
1 *
2 The*is embedded
3 The * is embedded
5 The*.*is embedded
6 The *.* is embedded
7 No asterisk
6 rows selected.
Со вторым условием исключаются только идентификаторы 1 и 8:
select * from t42 where MYCOLUMN <> '*';
ID MYCOLUMN
---------- --------------------
2 The*is embedded
3 The * is embedded
4 *.*
5 The*.*is embedded
6 The *.* is embedded
7 No asterisk
6 rows selected.