Есть ли более короткий путь - SQL - несколько как и как - PullRequest
0 голосов
/ 29 сентября 2018

Можно ли сократить такой оператор SQL, как этот?Если так, что это будет в MySQL, а также в PostgreSQL?

SELECT DISTINCT city FROM station 
WHERE (city LIKE 'A%' OR city LIKE 'E%' OR 
       city LIKE 'I%' OR city LIKE 'O%' OR city LIKE 'U%')
AND (city LIKE '%a' OR city LIKE '%e' OR city LIKE '%i' OR 
     city LIKE '%o' OR city LIKE '%u');

1 Ответ

0 голосов
/ 29 сентября 2018

С MySQL мы могли бы использовать регулярное выражение, что-то вроде этого:

WHERE city REGEXP '^[AEIOU].*[aeiou]$'

Не для того, чтобы погружаться слишком глубоко в регулярные выражения, но в качестве помощи для расшифровки этого:

  • каретка ^ соответствует началу строки

  • следующий символ должен быть одним из символов в наборе в квадратных скобках A, E, I, O или U

  • , за которым следует любое число любого символа, точка . соответствует любому символу, *повторение, ноль, один или несколько

  • последний символ должен совпадать с одним из символов в квадратных скобках a, e, i, o, u потому что знак доллара $ соответствует концу строки


Для тестирования используйте оператор SELECT

 SELECT t.city
      , t.city REGEXP '^[AEIOU].*[aeiou]$'
   FROM ( SELECT 'A' AS city 
          UNION ALL SELECT 'Aa' 
          UNION ALL SELECT 'Abba' 
          UNION ALL SELECT 'a' 
        ) t 

AsГордон указывает в комментарии, тот же подход с использованием сравнения регулярных выражений будет работать в PostgreSQL.Но там синтаксис немного другой, операция сравнения - это тильда ~ вместо ключевого слова MySQL REGEXP или RLIKE.

WHERE city      ~ '^[AEIOU].*[aeiou]$'

https://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP

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