2016-02-16 5 views
1

Я пытаюсь включить старые записи справочной службы в новое приложение службы поддержки. У меня все еще есть данные из старого справочного приложения, и он использует те же поля, что и новый, но в другом файле. Этот оператор select отлично подходит для нового приложения для поиска всех прошлых вызовов для чего-то определенного, будь то ключевое слово или кто он назначен и т. Д.SQL Union with coalesce (?) In where clause

SELECT status, identity, description, contact, scan_text, extended_desc, allocated_to 
FROM helpdesk.table1 
WHERE UPPER(allocated_to) = coalesce(?, allocated_to) 
    AND identity = coalesce(?, identity) 
    AND description = coalesce(?, description) 
    AND contact= coalesce(?, contact) 
    AND UPPER(scan_text) LIKE coalesce(?,scantext) 
    and upper(extended_desc) like coalesce(?, extended_desc) 
ORDER by allocated, identity desc 

То, что я пытаюсь сделать, это использовать какой-то союз, так что я могу есть только один ящик для поиска как более новые и старые записи, вместо двух различных коробок и того, чтобы вспомнить, где данные могут быть сохраняются. Я думал, что что-то вроде этого может работать, но я думаю, что предложение where здесь слишком неоднозначно, и я пробовал почти каждую комбинацию, включающую библиотеку перед полями.

Select * 
From 
(
select status, identity, description, contact, scan_text, extended_desc, allocated_to 
from helpdesk.table1 
Union         
select status, identity, description, contact, scan_text, extended_desc, allocated_to 
from helpdesk.table2 
) 
WHERE UPPER(allocated_to) = coalesce(?, allocated_to) 
    AND identity = coalesce(?, identity) 
    AND description = coalesce(?, description) 
    AND contact= coalesce(?, contact) 
    AND UPPER(scan_text) LIKE coalesce(?,scantext) 
    and upper(extended_desc) like coalesce(?, extended_desc) 
ORDER by allocated, identity desc 

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

Также я, вероятно, должен был сказать, что это db2, и sql работает в веб-приложении. Поэтому, когда этот sql запускает, он генерирует либо выпадающие окна, либо текстовое поле, чтобы помещать ваши собственные слова, чтобы сузить результаты всех вызовов службы поддержки.

+0

Какая СУБД для этого? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+0

Простите, довольно уверен, что это db2 – esuiker

ответ

0

Я не знаю, является ли это специфическим для генератора веб-приложений, который я использую, или если вы можете использовать его в других местах в разных SQL, но вы можете ссылаться на параметры и передавать их за кулисами с помощью чего-то называемого параметр параметра, которые являются 1, 2, 3 во второй половине союза. Это решило проблему наличия двух наборов ящиков для ввода пользователем, просто передав то, что вы вводите в первом месте. Вот окончательная версия кода, который работает для меня

SELECT status, identity, description, contact, scan_text, extended_desc, allocated_to 
FROM helpdesk.table1 
WHERE UPPER(allocated_to) = coalesce(?, allocated_to) 
AND identity = coalesce(?, identity) 
AND description = coalesce(?, description) 
AND contact= coalesce(?, contact) 
AND UPPER(scan_text) LIKE coalesce(?,scantext) 
and upper(extended_desc) like coalesce(?, extended_desc) 

Union 

SELECT status, identity, description, contact, scan_text, extended_desc, allocated_to 
FROM helpdesk.table2 
WHERE UPPER(allocated_to) = coalesce(??1, allocated_to) 
AND identity = coalesce(??2, identity) 
AND description = coalesce(??3, description) 
AND contact= coalesce(??4, contact) 
AND UPPER(scan_text) LIKE coalesce(??5,scantext) 
and upper(extended_desc) like coalesce(??6, extended_desc) 
ORDER by allocated, identity desc 

Спасибо за тех, кто пытался мне помочь.

0

Если я правильно понял, вам нужен индикатор, из которого происходит запись. Если это так:

Select * 
From (select 'old' as which, status, identity, description, contact, scan_text, extended_desc, allocated_to 
     from helpdesk.table1 
     Union all         
     select 'new', status, identity, description, contact, scan_text, extended_desc, allocated_to 
     from helpdesk.table2 
    ) hd 
WHERE UPPER(allocated_to) = coalesce(?, allocated_to) AND 
     identity = coalesce(?, identity) AND 
     description = coalesce(?, description) AND 
     contact= coalesce(?, contact) AND 
    UPPER(scan_text) LIKE coalesce(?,scantext) AND 
    upper(extended_desc) like coalesce(?, extended_desc) 
ORDER by allocated, identity desc; 

Вы можете добавить соответствующую where логику на which колонке (и переименовать столбец все, что вы хотели бы, а).

+0

Нет, я пытаюсь сделать только одно приглашение, которое относится как к новым записям, так и к старым записям. На самом деле не имеет значения, откуда берутся данные, поскольку они ссылаются на обе таблицы. – esuiker

0

Вы всегда можете просто указать, где находятся оба оператора select, которые вы пытаетесь объединить. Может быть быстрее, чем объединение обеих таблиц, а затем фильтрация.

SELECT * FROM helpdesk.table1 
WHERE UPPER(allocated_to) = coalesce(?, allocated_to) 
    AND identity = coalesce(?, identity) 
    AND description = coalesce(?, description) 
    AND contact= coalesce(?, contact) 
    AND UPPER(scan_text) LIKE coalesce(?,scantext) 
    and upper(extended_desc) like coalesce(?, extended_desc) 
UNION ALL 
SELECT * FROM helpdesk.table2 
WHERE UPPER(allocated_to) = coalesce(?, allocated_to) 
    AND identity = coalesce(?, identity) 
    AND description = coalesce(?, description) 
    AND contact= coalesce(?, contact) 
    AND UPPER(scan_text) LIKE coalesce(?,scantext) 
    and upper(extended_desc) like coalesce(?, extended_desc) 
ORDER BY allocated, identity desc; 

просто положил заказ после второго выбора. UPPER(allocated_to) = coalesce(?, UPPER(allocated_to)) синтаксис может работать лучше тоже если вас беспокоит случай.

+0

Проблема с этим заключается в том, что это выполняется через веб-приложение, а когда вы делаете то, где для них обоих, тогда отображается два набора полей для заполнения в веб-приложении. Это то, что я пытаюсь обойти. – esuiker

+0

ах .. Я полагал, что вы использовали какое-то параметризированное решение.не знакомы с собственными генерирующими веб-приложениями – JamieD77