Тестовый столбец для специальных символов или только символов / цифр - PullRequest
1 голос
/ 07 мая 2019

Я пытался найти специальные символы, используя общие атрибуты регулярных выражений и предложение NOT LIKE, но получал непонятные результаты. Исследование показало, что он работает не так, как в SQL Server или где-либо еще.

  1. Для определения наличия символа
  2. Для поиска, есть ли номер
  3. Для определения наличия специального символа

like '%[^0-9]%' или '%[^a-Z]%' не очень хорошо работает при поиске, если доступны нечисловые данные и если присутствуют не алфавитные данные, соответственно

SELECT column1 from some_table where column1 like '%[^0-9]%'; 
SELECT column1 from some_table where column1 like '%[^a-Z]%' 
SELECT column1 from some_table where column1 like '%[^a-Z0-9]%' 

Также отметили, что люди используют -> NOT like '%[^0-9]%'

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Postgres LIKE не поддерживает регулярные выражения.
Вам необходим оператор регулярного выражения ~.

Стандартный SQL также определяет SIMILAR TO как странное сочетание вышеперечисленного, но лучше его не использовать.См .:

Для определения наличия символа

... означает любой символ вообще :

... WHERE col <> '';                        -- any character at all?

Так что ни NULL, ни пусто.См .:

... означает любой буквенный символ (буква):

... WHERE col ~ '[[:alpha:]]';              -- any letters?

[[:alpha:]] - это класс символов для всех буквенных символов - не только букв ASCII [A-Za-z], включает такие буквы, как [ÄéÒçòý] и т. д.

Чтобы узнать, есть ли какое-либо число

... означающее любую цифру :

... WHERE col ~ '\d';                       -- any digits?

\d является сокращением класса для [[:digit:]].

Для нахождения какого-либо специального символа

..., означающего все, кроме цифр и букв:

... WHERE col ~ '\W';                       -- anything but digits & letters? 

\W isсокращение класса для [^[:alnum:]_] (подчеркивание исключено - руководство в настоящее время сбивает с толку).

... означает все, кроме цифр, букв и пробела:

... WHERE col ~ '[^[:alnum:]_ ]'            -- ... and space

Это сокращенное обозначение класса \W, дополнительно исключающее простое пространство.

... означающее все, кроме цифр, букв и пробелов:

... WHERE col ~ '[^[:alnum:]_\s]'           -- ... and any white space
... WHERE col ~ '[^[:alnum:]_[:space:]]'    -- ... the same spelled out

На этот раз исключая все пробелы, определенные классом символов Posix пробел .О "пробеле" в Unicode:

... означая любой не-ASCII символ:

Если ваш кластер БД работает с кодировкой UTF8, существует простой и очень быстрый взлом:

... WHERE octet_length(col) > length(col);  -- any non-ASCII letter?

octet_length() считает байт в строке, тогда как length()(псевдонимы: character_length() или char_length()) насчитывает символов в строке.Все основные символы ASCII ([\x00-\x7F]) кодируются 1 байтом в UTF-8, все остальные символы используют 2 - 4 байта.Любой не-ASCII-символ в строке делает выражение true.

для дальнейшего чтения:

0 голосов
/ 07 мая 2019

Проблема в том, что вы используете LIKE неправильно.Эти шаблоны не распознаются LIKE.

. Используйте ~ для сопоставления регулярных выражений:

select column1 from some_table where column1 ~ '[^a-Z0-9]' 

или более точно:

select column1 from some_table where column1 ~ '[^a-zA-Z0-9]'

Это вернетлюбой столбец с символом, не указанным в классе символов.

Здесь - это db <> скрипка.

...