2014-10-22 5 views
1

Я новичок в SQL и искал способ установки переменных в ANSI SQL. У меня есть это:Установка переменной в ANSI SQL

select * from table1 
where first_date > ‘2014-01-01' 
and where second_date = ‘2014-01-01’ 
and where third_date < ‘2014-01-01’ 

, но я надеюсь, что-то вроде:

set x = ‘2010-12-31’ 
select * from table1 
where first_date > x 
and where second_date = x 
and where third_date < x 

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

ответ

2

Стандарт (ANSI) SQL не имеет переменных. Но то, что вы может сделать в стандартном SQL, использует общее табличное выражение, чтобы иметь только одно значение.

Ниже ANSI SQL:

with data (the_date) as (
    values (date '2014-01-01') 
) 
select * 
from table1 
where first_date > (select the_date from data) 
    and second_date = (select the_date from data) 
    and third_date < (select the_date from data); 

выше будет работать на большинстве СУБД. Не все из них поддерживают это предложение values, но обычно это можно использовать, используя простой оператор select.

Как я никогда не использовал Netezza я понятия не имею, если она поддерживает конструктор строки (Оговорка values) или общих табличных выражений (Оговорка with)

Кроме того, некоторые клиенты SQL предлагают возможность определять переменные, заменен до того, как SQL фактически отправлен на сервер базы данных.

+0

, CTE работать в Netezza, но вместо «значений (дата„2014-01-01“)» вы бы использовать «выбрать„2014-01-01“:: DATE» – ScottMcG

0

Решение a_horse_with_no_name - единственное чистое SQL-решение, которое я знаю, которое не входит в процессуальную территорию расширения SQL. Существует еще одно решение, которое строго не указано вами, поскольку оно относится только к CLI NZSQL, но вы можете использовать такие переменные как это.

TESTDB.ADMIN(ADMIN)=> \set x '\'2014-01-01\'' 

TESTDB.ADMIN(ADMIN)=> 
SELECT * 
FROM table1 
WHERE first_date < :x 
AND second_date = :x 
AND third_date = :x; 
+0

Это именно то, что я имел в виду когда я писал «* некоторые SQL-клиенты предлагают возможность определять переменные *» –

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