Вернуть только те поля, которые содержат цифры или специальные символы, КРОМЕ. ошибка - PullRequest
2 голосов
/ 25 октября 2019

В Redshift я хочу вернуть поля, которые содержат числа или специальные символы ИСКЛЮЧИТЬ. (все, что угодно, а также аз и AZ)

Следующее дает мне все, что содержит число, но мне нужночтобы распространить это на любой специальный символ, кроме полной остановки (.)

SELECT DISTINCT name 
FROM  table
WHERE name ~ '[0-9]'

Мне нужно что-то вроде:

SELECT DISTINCT name 
FROM  table
WHERE name ~ '[0-9]' OR name ~'[,#';:@~[]{}etcetc'

Пример данных:

name
john
joh1n1
j!ohn!
jo!h2n
joh.n
jo.&hn
j.3ohn
j.$9ohn

Ожидаемый вывод:

name
joh1n1
j!ohn!
jo!h2n
jo.&hn
j.3ohn
j.$9ohn

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Вы можете использовать

WHERE name !~ '^[[:alpha:].]+$'

Здесь будут возвращены все записи, которые не состоят только из буквенных или точечных символов. ^ соответствует началу строки строки, [[:alpha:].]+ соответствует одной или нескольким буквам или точкам, а $ соответствует концу строки строки.

Если это для PostgreSQL, вы можете использовать

WHERE name SIMILAR TO '%[^[:alpha:].]%'

Оператор SIMILAR TO также принимает классы символов POSIX, выражения-скобки и символы подстановки и требует полного совпадения строк. Таким образом, % разрешает любые символы перед любым 1 символом, кроме буквы или точки ([^[:alpha:].]), а затем могут быть любые другие символы до конца строки.

1 голос
/ 25 октября 2019

Вы можете сделать:

SELECT DISTINCT name  FROM  table WHERE name !~* '[a-z]'

Это означает: совпадать с name с, которые не содержат буквенно-цифровых символов.

Оператор !~* означает:

Не соответствует регулярному выражению, без учета регистра


Редактировать на основе предоставленных данных выборки и ожидаемых результатов.

Если вы хотите сопоставить имена, которые содержат хотя бы один символ, отличный от буквенного символа или точки, то вы можете сделать:

select * from mytable where name ~* '[^a-z.]'

Демонстрация на DB Fiddle :

with mytable(name) as (values
    ('john'), 
    ('joh1n1'), 
    ('j!ohn!'), 
    ('jo!h2n'), 
    ('joh.n'),
    ('jo.&hn'),
    ('j.3ohn'),
    ('j.$9ohn')
)
select * from mytable where name ~* '[^a-z.]'
| name    |
| :------ |
| joh1n1  |
| j!ohn!  |
| jo!h2n  |
| jo.&hn  |
| j.3ohn  |
| j.$9ohn |
...