SQL: Что означает столбец <> '*. *'? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть существующий код, где я нашел ниже, где условие в таблице.

SELECT * FROM MYTABLE WHERE MYCOLUMN <> '*.*';

Есть ли разница между MYCOLUMN <> '*.*' и MYCOLUMN <> '*';

Что означает MYCOLUMN <> '*.*'?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Что означает MYCOLUMN <> '*.*'?

Если значение в MYCOLUMN не является точной строкой '*.*' и не является NULL, тогда оно будет соответствовать этому условию.

* не является символом подстановки.

Есть ли разница между MYCOLUMN <> '*.*' и MYCOLUMN <> '*'?

SQL Fiddle

Настройка схемы Oracle 11g R2 : Некоторые тестовые данные:

CREATE TABLE table_name ( mycolumn ) AS
SELECT '*' FROM DUAL UNION ALL
SELECT '*.*' FROM DUAL UNION ALL
SELECT 'a.b' FROM DUAL UNION ALL
SELECT 'a' FROM DUAL UNION ALL
SELECT NULL FROM DUAL;

Запрос 1 :

SELECT *
FROM   table_name
WHERE  MYCOLUMN <> '*.*'

Результаты : Соответствует всем строкам, которые не идентичны '*.*' или NULL.

| MYCOLUMN |
|----------|
|        * |
|      a.b |
|        a |

Запрос 2 :

SELECT *
FROM   table_name
WHERE  MYCOLUMN <> '*'

Результаты : Соответствует всем строкам, которые не идентичны '*' или NULL.

| MYCOLUMN |
|----------|
|      *.* |
|      a.b |
|        a |

Запрос 3 : Если вы хотите использовать подстановочные знаки в совпадении, используйте оператор LIKE с % в качестве подстановочного знака (вместо *).

SELECT *
FROM   table_name
WHERE  MYCOLUMN NOT LIKE '%.%'

Результаты : Соответствует всем значениям, которые не NULL и не содержат символ .:

| MYCOLUMN |
|----------|
|        * |
|        a |

Запрос 4 :

SELECT *
FROM   table_name
WHERE  MYCOLUMN NOT LIKE '%'

Результаты : Соответствует всем значениям, которые не NULL и не содержат ноль или более символов (это никогда ничего не будет совпадать).

No data found.
0 голосов
/ 28 июня 2018

Есть ли разница между 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. 
0 голосов
/ 28 июня 2018

Условие где

MYCOLUMN <> '*.*'

специально ищет текст, отличный от '*.*'. Этот поиск будет включать '*', потому что '*' отличается от '*.*'.

Условие where не проверяет регулярные выражения или символы подстановки.

Для поиска текста, ищущего текст с помощью *, вы можете использовать условие like - https://docs.oracle.com/cd/B13789_01/server.101/b10759/conditions016.htm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...