#regex #oracle
#регулярное выражение #Oracle
Вопрос:
У меня есть таблица в Oracle со столбцом VARCHAR под названием DESCRIPTION. Некоторые строки содержат непечатаемые символы, такие как символ с числовым значением 150 (который не набран латиницей-1 и является «Началом защищенной области» в Юникоде).
Я хочу выбрать все строки, столбцы ОПИСАНИЯ которых содержат символ, числовое значение которого находится в диапазоне от 128 до 160. Есть ли способ сделать это без длинного списка похожих предложений или объединенных вместе? Я полагаю, это можно сделать с помощью регулярных выражений, но я не нашел способа сделать это.
Ответ №1:
Недавно мне пришлось сделать что-то очень похожее на это, и я использовал некоторый SQL, подобный этому:
with codes as (select rownum code from dual connect by level <= 160)
select distinct t.id, t.description
from mytable t, codes c
where t.description like '%' || chr(c.code) || '%'
and c.code >= 128;
Ответ №2:
Пост Винсента очень помог мне с этой проблемой! Я хотел найти все строки, которые имели какой-либо расширенный ASCII: 128-255, поэтому я сократил инструкцию до этого:
SELECT description
FROM your_table
WHERE regexp_like (description, '['||chr(128)||'-'||chr(255)||']');
Короткий способ захватить ассортимент.
Ответ №3:
Вы могли бы использовать регулярное выражение, оно может работать лучше, чем более 30 отдельных предложений WHERE, но оно не будет намного красивее:
SELECT *
FROM your_table
WHERE regexp_like(description, '['||chr(128)||chr(129)||...||chr(160)||']')