В Oracle, как мне выбрать строки, которые содержат символ в определенном числовом диапазоне?

#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)||']')