Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Символ & для INSTR

select 
INSTR('abc$&dsfsdf', '$&')
from dual


вернуло 0.
WTF? Как обойти?

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE	11.2.0.4.0	Production
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production


Работаю с TOAD. Видимо, проблема в том, что & транслируется как параметр....
Ответ:
зеленый админ
select 
INSTR('abc$&dsfsdf', '$&')
from dual


select INSTR(:p_string, :p_substring)
  from dual
Вопрос: Teradata - Instr проблема с кирилицей

Господа,
нужно выдергивать из строки 5 фраз, который начинаются со слова-ключа и заканчиваются спецсимволом ';'

В Teradata для этого есть функция instr, но при парсинге кириллицы, запрос падает с ошибкой.

Как быть? И, возможно, есть более красивый способ парсинга?

Пример
select instr('деп: sdasda;na','деп',1)

Ошибка:
Error: [Teradata Database] [TeraJDBC 13.10.00.01] [Error 6706] [SQLState HY000] The string contains an untranslatable character.
SQLState: HY000
ErrorCode: 6706

П.С.
Рабочий запрос
with s as
(
select 'zap: sdasda;nap:sda;op:sdasd;zap:adsasda;otv:asder;ty' CommentString, 'zap' zap, 'dep' dep, 'op' op, 'nap' nap, 'otv' otv
)
select
CommentString,
substr(CommentString,instr(CommentString,zap,1),instr(CommentString,';',instr(CommentString,zap))-instr(CommentString,zap,1)) zap,
substr(CommentString,instr(CommentString,dep,1),instr(CommentString,';',instr(CommentString,dep))-instr(CommentString,dep,1)) dep,
substr(CommentString,instr(CommentString,op,1),instr(CommentString,';',instr(CommentString,op))-instr(CommentString,op,1)) op,
substr(CommentString,instr(CommentString,nap,1),instr(CommentString,';',instr(CommentString,nap))-instr(CommentString,nap,1)) nap,
substr(CommentString,instr(CommentString,otv,1),instr(CommentString,';',instr(CommentString,otv))-instr(CommentString,otv,1)) otv
from s
;
Ответ: С insert какая то бага...

Решил задачу с регулярными выражениями, может пригодиться.

with s as
(
select
'Заказчик: Иванов.И.И;Исполнитель: Сидоров В.В.;Описание: бла-бла' CommentString
)
select
cast(regexp_substr(CommentString,'((Заказчик:)+.*?)+(;|\Z)') as varchar(100)) zak,
cast(regexp_substr(CommentString,'((Исполнитель:)+.*?)+(;|\Z)') as varchar(200)) dep,
cast(regexp_substr(CommentString,'((Описание:)+.*?)+(;|\Z)') as varchar(1000)) op
from s
;
Вопрос: Instr и регулярное выражение, как?

Можно как-то использовать регулярку в INSTR?
Надо достать вхождение первой цифры...
Подскажите, пожалуйста, как это сделать
Ответ: regexp_hell,

Выглядит очень страшно, но я разберусь, спасибо большое.
Вопрос: Вопрос по regexp_instr

Доброе утро.
Можно ли с помощью regexp_instr написать следующее: instr(paths, '/_____999') = 0, где _____ - любые 5 символов? Если да, то как?

WITH
  t1 AS
  (
    SELECT
      '2 303580006001/2 303999006101/0 109540223002/0 000210950036/1 835509836500/0 109540162004/0 000210950034/1 948130000021'
      AS paths
    FROM
      dual
  )
SELECT
  instr(paths, '/') AS instr,
  paths
FROM
  t1
WHERE
  SUBSTR(paths, 1, 1) != '0'
  --  AND instr(paths, '/0') = 0
  ;


Нужно, чтобы в этом запросе изделие 2 303999006101 не проходило проверку. И как вы, надеюсь, понимаете, цифры могут меняться, все, кроме 999, но девятки могут быть и в других позициях, и при этом считаться "нормальными".

Need help!

P`s.
Ушел курить regexp_instr
Ответ: Ryuu,

WITH
  t1 AS
  (
    SELECT
      '2 303580006001/2 303999006101/0 109540223002/0 000210950036/1 835509836500/0 109540162004/0 000210950034/1 948130000021'
      AS paths
    FROM
      dual
      union all
    SELECT
      '2 303999006001/2 303777006101/0 109540223002/0 000210950036/1 835509836500/0 109540162004/0 000210950034/1 948130000021'
      AS paths
    FROM
      dual
  )
SELECT
  instr(paths, '/') AS instr,
  paths,
  regexp_instr(paths,'(/|^).{5}999')
FROM
  t1
WHERE
  SUBSTR(paths, 1, 1) != '0';
Вопрос: Разбиение строки

Здравствуйте
имеется такой запрос
with input as
(
  select 'a in (1..5)' as q from dual union all
  select 'a in (3..4) or a in (10..20)' from dual union all
  select 'a in (6..9) or a in (15..18)' from dual union all
  select 'a in (7..8) or a in (10..20) or a in (21..100)' from dual union all
  select 'a in (50..60)' from dual
)

select
  regexp_substr(i.q, '[0-9]{1,3}') as a_1,
  rtrim(regexp_substr(i.q, '[0-9]{1,3}\)'), ')') as a_2
from
   input i
union all
select
  regexp_substr(i.q, '[0-9]{1,3}', instr(i.q, 'or')),
  rtrim(regexp_substr(i.q, '[0-9]{1,3}\)', instr(i.q, 'or')), ')')
from
   input i
where
  instr(i.q, 'or') > 0
union all
select
  regexp_substr(i.q, '[0-9]{1,3}', instr(i.q, 'or', instr(i.q, 'or')+1)),
  rtrim(regexp_substr(i.q, '[0-9]{1,3}\)', instr(i.q, 'or', instr(i.q, 'or')+1)), ')')
from
   input i
where
  instr(i.q, 'or', instr(i.q, 'or')+1) > 0
  and instr(i.q, 'or') > 0

Можно ли его как-то упростить в один select?
Нужно из строки вида 'a in (6..9) or a in (15..18)' получить таблицу из двух строк
a_1a_2
69
1518
Ответ: -2-,

Что поделать, надо однократно перенести подобные данные в другую таблицу и писать ради этого программу совершенно не хочется.

ArtNick,
Спасибо, то, что нужно. Заодно осенило, что instr тут вообще не нужен.
with input as
(
  select 'a in (1..5)' as q from dual union all
  select 'a in (3..4) or a in (10..20)' from dual union all
  select 'a in (6..9) or a in (15..18)' from dual union all
  select 'a in (7..8) or a in (10..20) or a in (21..100)' from dual union all
  select 'a in (50..60)' from dual
),
xmlt as (
select a.column_value as q
 from input,
      xmltable(replace(translate (q,'()ain','""'),'or',','))  a
)
select
  regexp_substr(i.q, '[0-9]{1,3}', 1, 1) as a_1,
  regexp_substr(i.q, '[0-9]{1,3}', 1, 2) as a_2
from
  xmlt i
order by 1
Вопрос: Crystal Reports String Formulas,Extraction data, Вынос ИМЯ из ФИО

Есть поле ФИО, где данные записаны как Иванов, Иван, Иванович формула для имени:

mid (toText({Лист1_.ФИО}),InStr ({Лист1_.ФИО}, ',')+1,instr({Лист1_.ФИО},','))

второй instr, вроде как, должен лимитировать до второй запятой, но этого не происходит, в разных именах возвращает куски отчеств.
Как можно получить только имя?
Ответ: на просторах форума нарыл формулу:
mid ({Лист1_.ФИО},InStr ({Лист1_.ФИО},',' )+1 ,InStrrev ({Лист1_.ФИО},',' )-instr({Лист1_.ФИО},',' )-1)
при проверке ошибок не находит
при сохранении "длина строки меньше 0 или не является целым числом"
Вопрос: Как можно указать номер вхождения в строку, позиция которого интересует?

Есть данные вида "0.1", "0.1.3". То есть десятичные числа, разделенные точкой.
Мен нужно отобрать значения, где фигурирует не меньше трех чисел (то есть минимум две точки) и вычислить для них родителя (значение без последнего числа).
То есть для "0.1.3" родителем будет "0.1", для "0.1" родителя нет, а для "0.4.1.3" родителем будет "0.4.1".
INSTR всегда находит только первое вхождение. Можно сконструировать сложное выражение INSTR(SUBSTRING(fld,INSTR(fld,'.')+1),'.')+INSTR(fld,'.')-1, но может быть есть более подходящая функция?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
Ответ:
Alibek B.
INSTR всегда находит только первое вхождение.

STRREVERSE() в помощь.
Вопрос: Задание переменных в Report Builder 3.0

Приветствую всех присутствующих.
Не совсем уверен, что по адресу, но, может, кто сталкивался.
В общем суть:
Имеем MySQL БД (удаленная),имеем ODBC-драйвер, через который цепляемся к этой БД, имеем построитель отчетов Report Builder 3.0.

Отчет строится, все нормально. Единственное неудобство - Report Builder не понимает стандартного задания переменных для оракловых бд (через @) и пришлось воспользоваться костылем вот такого вида:

where instr(?,concat(';',t.ид_сдел,';'))

ид_сдел - id сделок (может быть как одна, так и несколько)
Что бы множественность выбора сработала при построении запроса, в Наборе данных, в разделе Параметры, пришлось прописать следующее (конкретно на эту переменную):

=";" & join(Parameters!Parameter1.Value,";") & ";"

Все работает, и даже без ошибок.

Встал следующий вопрос - как в этом выпадающем списке параметров (список сделок) прописать строку "Все", при выборе которой выбирались бы все сделки (что бы не пришлось тыкать в каждую сделку отдельно).
Есть, конечно, вариант при построении отчета жмакать кнопку "Выбрать все" - тогда происходит выделение всех строк со сделками, но Заказчика такой вариант не устраивает.

Стандартные методы задания такого вида переменных ('All' in "наименование переменной" or поле_значений in "наименование переменной") - не работает (В моем случае это выглядит вот так:

where instr('All' in (?) or (?),concat(';',t.ид_контр,';'))

при таком варианте описания переменной в отчет вызывается дополнительная переменная (т.е. Report Builder воспринимает такую запись как 2 переменные (т.к. один знак вопроса (?) воспринимается как одна переменная)
Ответ: В общем всем спасибо за просморты))
Разобрался.
Может кому пригодится:
Добавляем в наш select 2 столбца:
SQL
1
2
3
4
SELECT 
'Все' allstat,
'0000001' allstatid
FROM dual
Далее идем к нашим костыльным переменным и прописываем в них следующее:
SQL
1
WHERE (instr(?,concat(';',t.allstatid,';')) OR instr(?,concat(';',t.idzak,';')))
Т.е. принудительно задаем им на выбор наш прописанный столбец, и второй столбец - с id заказов (t.idzak)

В Report Builder-е указанная строка преобразуется в 2 переменных (т.к. два знака вопроса - он не понимает, что это в рамках одного условия, а значит и в рамках одной переменной)
Что бы в билдере эта конструкция работала как одна переменная:
- Копируем наш код и вставляем его в набор данных в Report Builder
- НЕ НАЖИМАЕМ на "ОК", а переходим в раздел "Параметры" (В свойствах набора данных, куда вставляли код)
- В разделе Параметры видим 2 переменные со знаком вопроса (?)
- В каждую из двух переменных прописываем вот это:
SQL
1
=";" & JOIN(Parameters!Parameter1.VALUE,";") & ";"
Где Parameter1 - порядковый номер нашего параметра (в данном случае он у нас один)

Все - билдер видит вашу переменную как одну и позволяет выбрать параметр "Все"
Вопрос: clob построчно

Добрый день.
Пробую считать содержимое clob поля таблицы построчно. Используя для этого dbms_lob.instr, dbms_lob.substr если небольшое количество строк то ещё ничего у меня же этих строк 57348 и время за которое выбирается строка в переменную большое, я даже нестал до конца ждать(было больше 20 минут). В чем здесь может быть дело. Что еще можно использовать для построчного чтения clob ?
Ответ:
Anton_DS
r900000
Разделитель между строчками CHR (10), а в строчках столбцы(данные) разделены пробелами.
Prices and Yield Trade's Volume Best on closing KZT/USD Currency Type
Clean price for bonds Yield to maturity Price (gross price for bond) in number in Clean price Yield to maturity Price Deals NIN or Listing exchange of of ID
Date Code Open High Low Last Average Open High Low Last Average Open High Low Last Average of securities US dollar Bid Offer Bid Offer Bid Offer number NSIN category rate quote securities records
Date Code OpenCP HighCP LowCP LastCP AverageCP OpenY HighY LowY LastY AverageY OpenP HighP LowP LastP AverageP Volume VolUSD BidCP OfferCP BidY OfferY BidP OfferP Deals NIN Listing Rate Currency Type ID
02.10.2007 aASAVb2 0 0 94,0826 98,4167 11,0000 8,9990 976,5622 1019,9033 0 KZPC2Y03C346 C 120,9800 KZT 4 2208269

WITH ttt
       AS (SELECT   DBMS_LOB.getlength (txt) - DBMS_LOB.getlength (REPLACE (txt, CHR (13), '')) ln_cnt
           FROM     loader.bonus_mates)
SELECT   lvl num, to_char(','||SUBSTR (txt, start_pos+2, end_pos - start_pos -2)) line
FROM     (SELECT       LEVEL lvl, NVL (DBMS_LOB.INSTR (txt, CHR (13) || CHR (10), 1, LEVEL - 1), 0) start_pos
                      ,DBMS_LOB.INSTR (txt, CHR (13) || CHR (10), 1, LEVEL) end_pos, txt
          FROM         loader.bonus_mates
          CONNECT BY   LEVEL < (SELECT       ln_cnt FROM ttt))
я недавно делал нечто подобное..
в общем могу подсказать первый шаг как выташить строки.. из файла..
дальше уже рег_экспы или класические сабстры тибе в помощь..

Блин тока там разделители подправь..
у миня тм походу заяпятые, но я думаю разберешься с логикой запроса.
Вопрос: Найти позицию в строке по номеру вхождения

Добрый день!

Функция instr() в MySql невыгодно отличается от аналогичной в Oracle.
Есть альтернатива? Надо найти, допустим, 2-е вхождение 'a' в строке 'авыфапро'
Ответ: Найдите тогда INSTR() в 'asdfgasdawer' позицию 2-го вхождения 'a'
ссылка в предыдущем на SUBSTR :)

INSTR: