SQL, ПОДОБНЫЙ ‘[AMD]%’

#sql #oracle #sql-like

#sql #Oracle #sql-подобный

Вопрос:

Я наткнулся на один онлайн-сайт, который предполагает, что следующее является допустимым утверждением SQL….

 SELECT *
FROM PARTS
WHERE Desc1 LIKE '[AMD]%'
 

Предполагается, что это вернет все desc1, которые начинаются с A, M или D

Я не могу заставить это возвращать результаты и должен это сделать

 SELECT *
FROM PARTS
WHERE Desc1 LIKE 'A%' OR Desc1 LIKE 'M%' OR Desc1 LIKE 'D%' 
 

Я использую Oracle Express 11g (XE) правильный ли формат ‘[AMD]%’?

Ответ №1:

Синтаксис, на который вы ссылаетесь, — это синтаксис SQL Server. Oracle имеет лучшую поддержку регулярных выражений, поэтому вы бы сделали:

 SELECT *
FROM PARTS
WHERE regexp_like(Desc1, '^[AMD].*

На самом деле,  .*$  это не нужно, так что вы можете написать WHERE regexp_like(Desc1, '^[AMD]'  . Разница между  LIKE  шаблонами и регулярными выражениями заключается в том, что  LIKE  шаблоны соответствуют всей строке, а регулярные выражения - только ее части. Когда я использую регулярные выражения в SQL, они часто совпадают со всей строкой, чтобы избежать когнитивного диссонанса.

Кстати, вы также можете сделать:

 WHERE substr(DESC1, 1, 1) IN ('A', 'M', 'D')
 

Комментарии:

1. Отличная помощь @Gordon Linoff, существует ли также синтаксис Oracle для сопоставления или улучшения синтаксиса SQL Server ВЫБЕРИТЕ * ИЗ ЧАСТЕЙ, ГДЕ GRP1, НАПРИМЕР, указывает '[A-D]%', а GRP1 начинается с любой из букв A, B, C или D?

Ответ №2:

По крайней мере, для Oracle запрос, который вы нашли в Интернете, выглядит неправильно. Правильная версия будет:

 SELECT * FROM PARTS WHERE REGEXP_LIKE (Desc1, '^[AMD]');
 

Взгляните на документацию Oracle: https://docs.oracle.com/cd/B12037_01/server.101/b10759/conditions018.htm

);
На самом деле, .*$ это не нужно, так что вы можете написать WHERE regexp_like(Desc1, '^[AMD]' . Разница между LIKE шаблонами и регулярными выражениями заключается в том, что LIKE шаблоны соответствуют всей строке, а регулярные выражения — только ее части. Когда я использую регулярные выражения в SQL, они часто совпадают со всей строкой, чтобы избежать когнитивного диссонанса.

Кстати, вы также можете сделать:


Комментарии:

1. Отличная помощь @Gordon Linoff, существует ли также синтаксис Oracle для сопоставления или улучшения синтаксиса SQL Server ВЫБЕРИТЕ * ИЗ ЧАСТЕЙ, ГДЕ GRP1, НАПРИМЕР, указывает ‘[A-D]%’, а GRP1 начинается с любой из букв A, B, C или D?

Ответ №2:

По крайней мере, для Oracle запрос, который вы нашли в Интернете, выглядит неправильно. Правильная версия будет:


Взгляните на документацию Oracle: https://docs.oracle.com/cd/B12037_01/server.101/b10759/conditions018.htm