2014-02-05 3 views
0

Выполняю нижеследующий запрос и используя псевдоним для всех столбцов. Я назвал псевдоним с a. поскольку это требование. Теперь, я хочу, чтобы ссылаться на имя псевдонима непосредственно в ИНЕКЕ и я сделать это, как указано ниже:Использование alisa в выражении WHERE

SELECT pt.prod_desc AS"PROD_DESC", 
(
CASE 
WHEN pt.prod_level='2' 
THEN 'Product' 
WHEN pt.prod_level='4' 
THEN 'Sub-Product' 
WHEN pt.prod_level='5' 
THEN 'Service' 
ELSE 'N/A' 
END)   AS"PROD_LEVEL", 
prod_id  AS "PROD_ID", 
isactive  AS "IsActive", 
updt_usr_sid AS "UPDT_USR_SID", 
updt_ts  AS "UPDT_TS", 
(
CASE 
WHEN pt.prod_level='5' 
THEN parent_prod_id 
ELSE NULL 
    END) AS ".SUB_PROD_ID", 
(
CASE 
    WHEN pt.prod_level='5' 
    THEN 
    (SELECT prod_desc FROM dims_prod_type A WHERE A.prod_id= pt.parent_prod_id 
) 
    ELSE 'N/A' 
END) AS ".SUB_PROD_DESC", 
(
CASE 
WHEN pt.prod_level='4' 
THEN parent_prod_id 
WHEN pt.prod_level='5' 
THEN 
    (SELECT parent_prod_id 
    FROM dims_prod_type A 
    WHERE A.prod_id= pt.parent_prod_id 
    ) 
ELSE NULL 
    END) AS ".PRNT_PROD_ID", 
(
CASE 
WHEN pt.prod_level='4' 
THEN 
    (SELECT prod_desc FROM dims_prod_type A WHERE A.prod_id=pt.parent_prod_id 
    ) 
    WHEN pt.prod_level='5' 
THEN 
    (SELECT prod_desc 
    FROM dims_prod_type A 
    WHERE A.prod_id IN 
    (SELECT B.parent_prod_id 
    FROM dims_prod_type B 
    WHERE b.prod_id=pt.parent_prod_id 
    ) 
) 
ELSE 'N/A' 
END)AS ".PRNT_PROD_DESC" 
FROM dims_prod_type pt 
WHERE pt.".PRNT_PROD_ID" like 'A%'; 

Однако, когда я исполняющего это я получаю следующее сообщение об ошибке:

SQL Error: ORA-00904: "PT".".PRNT_PROD_ID": invalid identifier 
    00904. 00000 - "%s: invalid identifier" 

I что SQL выполняет первое предложение where и, следовательно, является причиной ошибки. Но как я могу это исправить? Любые предложения, пожалуйста?

+0

Пожалуйста, отформатируйте запрос, чтобы он был более читабельным. – kyooryu

+0

Не имеет отношения к вопросу на самом деле, но почему это требование иметь «.» В псевдониме? В вашем предыдущем вопросе было упомянуто, что в нем необходимо указывать псевдоним везде и точно соответствовать используемому случаю. Я не могу придумать, почему это было бы полезно. Просто любопытно ... –

ответ

1

Вы уже знаете, что вы can't use the alias in the where clause, но это относится только в том же самом уровне SQL. Вы можете обернуть запрос во внешнем запросе:

SELECT * 
FROM (
    SELECT pt.prod_desc AS"PROD_DESC", 
    ... 
    END)AS ".PRNT_PROD_DESC" 
    FROM dims_prod_type pt 
) 
WHERE ".PRNT_PROD_ID" like 'A%'; 

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

0

Заменить «СТ». «PRNT_PROD_ID» на «СТ». «PRNT_PROD_ID» или для лучшего понимания по pt.prnt_prod_id

+0

Это не сработает, так как предложение where будет оценено первым, и к этому времени ссылка на pt.prnt_prod_id не будет существовать. – Ankit

1

Поместите запрос в подзапрос, то вы можете обратиться к псевдонимами в вашей где положение, например:

SELECT * FROM (
    SELECT pt.prod_desc AS"PROD_DESC", 
    ...etc... 
    FROM dims_prod_type pt) pt 
WHERE pt.".PRNT_PROD_ID" like 'A%'; 
Смежные вопросы