2013-04-05 3 views
2

Предположим, что у меня есть этот запрос:Создать константу в Postgresql

select * 
from myTable 
where myTable.myCol in (1,2,3) 

Я хотел бы сделать это:

with allowed_values as (1,2,3) 
select * 
from myTable 
where myTable.myCol in allowed_values 

Это дает мне синтаксическая ошибка в первой строке, вы можете помочь меня это фиксирует?

+0

Что вы написали использует «allowed_values», как будто это переменная. Это не. –

ответ

3

Близко к то, что вы, вероятно, имели в виду:

WITH allowed_values AS (SELECT '{1,2,3}'::int[] AS arr) 
SELECT * 
FROM my_table 
     ,allowed_values -- cross join with a single row 
WHERE my_col = ANY (arr); 

лучше:

WITH allowed_values (my_col) AS (VALUES (1), (2), (3)) 
SELECT * 
FROM allowed_values 
JOIN my_table USING (my_col) 

Но на самом деле, вы можете просто упростить:

SELECT * 
FROM (VALUES (1), (2), (3)) AS allowed_values (my_col) 
JOIN my_table USING (my_col); 
+0

У вас есть точка в первом. «1,2,3» - это строка, которая поступает из текстового поля: я могу ее подделать, но это сложно усложнить с той целью, которую я имею в виду! Спасибо. – Aslan986

2

Попробуйте

with allowed_values as (select 1 as tst union all select 2 union all select 3)  
select * from myTable a 
inner join c1 b ON (b.tst = a.myCol) 
2

Самый простой путь вперед, чтобы исправить общее табличное выражение, а затем использовать его в подвыборки.

with allowed_values as (
    select 1 id 
    union all 
    select 2 
    union all 
    select 3 
) 
select * from myTable 
where myTable.id in (select id from allowed_values) 
6

Ближайший я могу думать, чтобы ваш синтаксис:

WITH allowed_values (id) AS 
    (VALUES 
     (1), (2), (3) 
) 
SELECT * 
FROM myTable 
WHERE id IN 
    (TABLE allowed_values) ; 

Испытано в SQL-Fiddle

+0

Это интересно. Я бы не подумал, что «table allowed_values» работает в подвыборке. –

+0

Конструктор таблиц в предложении WHERE. Это то, что я искал. –

+0

@ MikeSherrill'Catcall ': Это просто синтаксический ярлык для '(SELECT * FROM allowed_values)'] (http://www.postgresql.org/docs/current/interactive/sql-select.html#SQL-TABLE) , –

Смежные вопросы