Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602

Oracle Фильтр после DECODE

09.08.2013, 15:05. Показов 1747. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Еще раз привет всем. Формирую простои запрос SQL Developer

Oracle 11 SQL
1
2
3
SELECT  first_name, last_name, job_id, 
DECODE(job_id,'IT_PROG','Прогр-ты','AD_PRES','Президент','Unknown')  Професия
FROM employees
Хочу отфильтровать поля который появился после DECODE через WHERE фильтрую вот так и работает

Oracle 11 SQL
1
2
3
4
SELECT  first_name, last_name, job_id, 
DECODE(job_id,'IT_PROG','Прогр-ты','AD_PRES','Президент','Unknown')  Професия
FROM employees
WHERE DECODE(job_id,'IT_PROG','Прогр-ты','AD_PRES','Президент','Unknown') = 'Президент';
Вопрос: Как это фильтр реализовать из Delphi

Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 OraQuery1.Close;
 OraQuery1.SQL.Clear;
 OraQuery1.SQL.Add('select  first_name, last_name, job_id, '+
                   'DECODE(job_id,''IT_PROG'',''Прогр-ты'',''AD_PRES'',''Президент'',''Unknown'')  Професия '+
                   'from employees');
 OraQuery1.SQL.Add('WHERE DECODE(job_id,''IT_PROG'',''Прогр-ты'',''AD_PRES'',''Президент'',''Unknown'') IN ('+ Edit1.Text+ ')');
 OraQuery1.Open;
end;
Так не работает.... Пожалуйста помогите разобрать как передать правильно where DECODE(job_id,'IT_PROG','Прогр-ты','AD_PRES','Президент','Unknown') = что бы работал
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2013, 15:05
Ответы с готовыми решениями:

Филтрация после DECODE
Здравствуйте ребята. Формирую простои запрос на учебный схеме HR select first_name, last_name, job_id, ...

LC фильтр после линейного стабилизатора
Здравствуйте форумчане. Имеется схема блока питания на линейном стабилизаторе (часть на рисунке), интересует каким образом правильно...

LC фильтр после PWM (a-la усилитель D-класса)
На днях игрался с воспроизведением музыки через PWM. А так как недавно читал про принцип работы усилителей D-класса, то решил "не...

14
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
09.08.2013, 15:31
Ну, либо так:
Delphi
1
2
OraQuery1.SQL.Add('WHERE DECODE(job_id,''IT_PROG'',''Прогр-ты'',''AD_PRES'',''Президент'',''Unknown'') IN (' +
   QuotedStr(Edit1.Text) + ')');
, либо так:
Delphi
1
2
OraQuery1.SQL.Add('WHERE DECODE(job_id,''IT_PROG'',''Прогр-ты'',''AD_PRES'',''Президент'',''Unknown'') = ' +
   QuotedStr(Edit1.Text);
1
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602
09.08.2013, 16:08  [ТС]
UI Дай бог тебе здоровья и счастья . Вот так работает нормально

Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 OraQuery1.Close;
 OraQuery1.SQL.Clear;
 OraQuery1.SQL.Add('select  first_name, last_name, job_id, '+
                   'DECODE(job_id,''IT_PROG'',''Прогр-ты'',''AD_PRES'',''Президент'',''Unknown'')  Професия '+
                   'from employees');
 OraQuery1.SQL.Add('WHERE DECODE(job_id,''IT_PROG'',''Прогр-ты'',''AD_PRES'',''Президент'',''Unknown'') IN (' + QuotedStr(Edit1.Text) + ')');
 OraQuery1.Open;
end;
Добавлено через 29 минут
Работает только на одно значения. на пример ''Прогр-ты' если мне нужно передать несколько значения из Edit1 вот так ('Президент', 'Прогр-ты')

вот такой запрос

Oracle 11 SQL
1
2
3
4
SELECT  first_name, last_name, job_id, 
DECODE(job_id,'IT_PROG','Прогр-ты','AD_PRES','Президент','Unknown')  Професия
FROM employees
WHERE DECODE(job_id,'IT_PROG','Прогр-ты','AD_PRES','Президент','Unknown') IN ('Президент', 'Прогр-ты');
Пожалуйста здесь что делать ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
09.08.2013, 16:45
Цитата Сообщение от xxbesoxx Посмотреть сообщение
если мне нужно передать несколько значения из Edit1 вот так ('Президент', 'Прогр-ты')
Нет-нет... Не так надо вводить несколько значений в Edit1... Или вводи 'Президент' в апострофах, 'Президент', 'Прогр-ты', то есть, то, что должно быть внутри скобок в запросе, и просто:
Delphi
1
2
OraQuery1.SQL.Add('WHERE DECODE(job_id,''IT_PROG'',''Прогр-ты'',''AD_PRES'',''Президент'',''Unknown'') IN (' + 
   Edit1.Text + ')');
, или вводи параметры, разделённые запятыми безо всяких апострофов, вот так: Президент или Президент,Прогр-ты, и оборачивай каждый отдельный параметр в апострофы вот так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  i : Integer;
begin
  OraQuery1.Close;
  OraQuery1.SQL.Clear;
 
  with TStringList.Create do
  try
    StrictDelimiter := True;
    CommaText := Edit1.Text;
    for i := 0 to Count - 1 do Strings[i] := QuotedStr(Strings[i]);
 
    OraQuery1.SQL.Add('select  first_name, last_name, job_id, '+
                      'DECODE(job_id,''IT_PROG'',''Прогр-ты'',''AD_PRES'',''Президент'',''Unknown'')  Професия '+
                      'from employees');
    OraQuery1.SQL.Add('WHERE DECODE(job_id,''IT_PROG'',''Прогр-ты'',''AD_PRES'',''Президент'',''Unknown'') IN (' + 
        CommaText + ')');
  finally
    Free;
  end;
  OraQuery1.Open;
end;
1
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602
09.08.2013, 17:02  [ТС]
UI Спасибо, выручил. Даже больше!!! Спасли жизнь человеку который попал в страшную аварию

Добавлено через 3 минуты
Дай бог тебе здоровья
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602
10.08.2013, 18:29  [ТС]
UI Извиняюсь , Еще один вопрос . Допустим делали запрос SELECT таблицу Employees

Oracle 11 SQL
1
2
3
SELECT employee_id, first_name, last_name, hire_date
FROM employees
WHERE  TO_CHAR( hire_date, 'dd.mm.yyyy') BETWEEN '17.06.1987' AND '20.06.1987'
Мне надо отфильтровать это данных который уже есть. Просто отфильтровать

Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 if Length(Edit1.Text) >0 then
 begin
   OraQuery1.Filtered := False;
   OraQuery1.Filter:='[EMPLOYEE_ID] = '+ '''' + Edit1.Text  + '''';
   OraQuery1.Filtered := true;
   end
   else OraQuery1.Filtered := False;
 end;
фильтрую данных который у меня уже есть . Мне не надо SQL запрос отправит на сервере.....
как добавить на это фильтре разделительный знак ( , ) что бы передать несколько значения. как вы переделали #4 .... мне надо точно такой. Пожалуйста помогите
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
10.08.2013, 20:15
Пардон, а каким образом фильтр сработает, если у тебя есть одно поле и несколько значений? В каком формате должен быть фильтр, можешь написать? Готовая строка как должна выглядеть? Понятно, что для одного значения - это [EMPLOYEE_ID] = 'example', а для нескольких - оно же должно быть через IN, или как?
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602
10.08.2013, 20:55  [ТС]
Ваши пример на #4 работает очень хорошо..... Но если БД большой и один раз выполняли какой то запрос . До пустим OraQuery из свойства SQL прописал это запрос

Oracle 11 SQL
1
2
3
SELECT employee_id, first_name, last_name, hire_date
FROM employees
WHERE  TO_CHAR( hire_date, 'dd.mm.yyyy') BETWEEN '17.06.1987' AND '20.06.1987'
Как то можно отфильтровать это данных по employee_id без вложенный sql запрос таком стиле
Delphi
1
OraQuery1.Filter:='[EMPLOYEE_ID] = '+ '''' + Edit1.Text  + '''';
Смысл в том что ! если БД большой , выходные данные собираются из несколько таблиц , Запрос формируется долга .......... Из Dataset или как то можно это данных отфильтровать который у меня уже есть.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
10.08.2013, 21:23
Не знаю, как в OraQuery, но ADOQuery позволяет сделать вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.Button1Click(Sender: TObject);
const
  FieldName = '[Text]';
var
  i : Integer;
begin
  ADOQuery1.Filtered := False;
  with TStringList.Create do
  try
    StrictDelimiter := True;
    Delimiter := '$';
    CommaText := Edit1.Text;
    for i := 0 to Count - 1 do
      Strings[i] := FieldName + ' = ' + QuotedStr(Strings[i]);
    ADOQuery1.Filter := StringReplace(DelimitedText, Delimiter, ' OR ', [rfReplaceAll]);
  finally
    Free;
  end;
  ADOQuery1.Filtered := True;
end;
, и играться с фильтрами:
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602
10.08.2013, 21:26  [ТС]
так что бы не отправит еще запрос на сервере....... отфильтровать Grid таком принципе через ( , )

Добавлено через 1 минуту
щас попробую ..... Спасибо
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602
10.08.2013, 21:57  [ТС]
Цитата Сообщение от xxbesoxx Посмотреть сообщение
так что бы не отправит еще запрос на сервере....... отфильтровать Grid таком принципе через ( , )

Добавлено через 1 минуту
щас попробую ..... Спасибо
Нет у меня не работает

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.BitBtn1Click(Sender: TObject);
 const
  FieldName = '[Text]';
   Var
    i : integer;
begin
   OraQuery1.Filtered := False;
   With TStringList.Create do
   try
     StrictDelimiter := true;
     Delimiter := '$';
     CommaText := Edit1.Text;
     for i := 0 to Count - 1 do
       Strings[i] := FieldName + ' = ' + QuotedStr(Strings[i]);
     OraQuery1.Filter := StringReplace(DelimitedText, Delimiter, 'OR', [rfReplaceAll]);
   finally
     Free ;
   end;
   OraQuery1.Filtered := True;
 end;
Миниатюры
Oracle Фильтр после DECODE  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
10.08.2013, 22:00
Ну замени константу FieldName, чтобы она содержала твое имя поля:
Delphi
1
2
const
  FieldName = '[EMPLOYEE_ID]';
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602
10.08.2013, 22:34  [ТС]
UI Огромное спасибо что уделили меня время .... Попробую поигратся ....

Добавлено через 2 минуты
UI Спасибо....... Вот меня уже стыдно

Добавлено через 8 минут
Друг работает Супер. это фильтр можно поменять логика.... ?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.BitBtn1Click(Sender: TObject);
 const
  FieldName = '[EMPLOYEE_ID]';
   Var
    i : integer;
begin
   OraQuery1.Filtered := False;
   With TStringList.Create do
   try
     StrictDelimiter := true;
     Delimiter := '$';
     CommaText := Edit1.Text;
     for i := 0 to Count - 1 do
       Strings[i] := FieldName + ' = ' + QuotedStr(Strings[i]);
     OraQuery1.Filter := StringReplace(DelimitedText, Delimiter, 'OR', [rfReplaceAll]);
   finally
     Free ;
   end;
   OraQuery1.Filtered := True;
 end;

До пустим у меня

EMPLOYEE_ID

100
101
102
105

И когда и дубу в Edit набирать 100,101 показать все остальные кроме это

OraQuery1.Filter := StringReplace(DelimitedText, Delimiter, ' NOT', [rfReplaceAll]); здесь не будет работать ?

Добавлено через 22 минуты
Как поменять логика обратное сторону ?
-------------------------------------------------------------
Delimiter, 'NOT LIKE string ' ТАК НЕ РАБОТАЕТ
Delimiter, 'not in',
-------------------------------------------------------------
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,912
Записей в блоге: 12
10.08.2013, 23:06
Ну, например, поменять "=" на "<>", а OR на AND:
Delphi
1
2
3
    for i := 0 to Count - 1 do
      Strings[i] := FieldName + ' <> ' + QuotedStr(Strings[i]);
    ADOQuery1.Filter := StringReplace(DelimitedText, Delimiter, ' AND ', [rfReplaceAll]);
, тогда будут отбрасываться все те значения, которые указаны в Edit1, остальные - останутся...
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602
10.08.2013, 23:17  [ТС]
Разбираю логика меняется здесь

Delphi
1
    Strings[i] := FieldName + ' > ' + QuotedStr(Strings[i]);
{ < Меньше } { > Больше } работает да. Но не работает { <> Не равно }

Добавлено через 1 минуту
Щас друг попробую

Добавлено через 4 минуты
Вот это супер

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.BitBtn1Click(Sender: TObject);
 const
  FieldName = '[EMPLOYEE_ID]';
   Var
    i : integer;
begin
   OraQuery1.Filtered := False;
   With TStringList.Create do
   try
     StrictDelimiter := true;
     Delimiter := '$';
     CommaText := Edit1.Text;
     for i := 0 to Count - 1 do
       Strings[i] := FieldName + ' <> ' + QuotedStr(Strings[i]);
     OraQuery1.Filter := StringReplace(DelimitedText, Delimiter, ' AND ', [rfReplaceAll]);
   finally
     Free ;
   end;
   OraQuery1.Filtered := True;
 end;
Огромное спасибо .... Вы спасали меня жизнь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.08.2013, 23:17
Помогаю со студенческими работами здесь

Не работает фильтр после записи Даты
Доброе утро. Выручайте, голову сломал. Если в екселе (Лист Бюджет) дату поставить вручную, то расширенный фильтр (условие: колонка справа)...

Фильтр данных после запроса на выборку
Начну сначала. Данные загружаются в грид после выбора значения в комбобоксе private void comboBox4_SelectedIndexChanged(object sender,...

DataGridViewAutoFilter как оставить фильтр после рефреша
Привет всем, использую на столбца фильтр с помощью DataGridViewAutoFilter, подскажите как сделать что бы после апдейта датагрида он не...

После установки Oracle не запускается SQLPlus
Всем доброго времени суток! на RHEL установил оракл 10g . Проблем при установке не возникало. Но после установки не запускается sqlplus....

Не могу подключиться после установки Oracle 9.2
Помогите разобраться, пожалуйста. Задача: поставить сервер на новую машину. Заодно решено сделать апгрейд с 8.1.6 на 9.2....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru