postgresql — Как использовать переменную postgres в предложении select
спросил
Изменено 4 месяца назад
Просмотрено 14 тысяч раз
С MSSQL это просто: @, отмечающий начало всех имен переменных, позволяет синтаксическому анализатору знать, что это переменная, а не столбец.
Это полезно для таких вещей, как вставка постоянных значений, когда выбор обеспечивает ввод в таблицу вставки при копировании из промежуточной таблицы.
объявить @foo varchar(50) = 'бар'; выберите @foo;
Как это выразить для postgres?
- postgresql
PostgreSQL не так гибок в том, где и как он позволяет использовать переменные. Самое близкое к тому, чего вы пытаетесь достичь, вероятно, будет окружать его DO 9. 0024 блокировать так:
DO $$ ОБЪЯВИТЬ foo TEXT; НАЧИНАТЬ foo := 'бар'; ВЫБЕРИТЕ фу; КОНЕЦ $$;
Обратите внимание, что это зависит от контекста, и вы можете найти дополнительную информацию в этом ответе StackOverflow.
Кроме того, вы можете создать функцию, которая объявляет переменные и возвращает значение, например:
CREATE FUNCTION example_function () RETURNS text AS ' ЗАЯВИТЬ -- Объявить постоянное целое число с -- значение по умолчанию 5. пять ПОСТОЯННЫХ ЦЕЛЫХ := 5; -- Объявить целое число со значением по умолчанию -- значение 100, которое не может быть NULL. десять INTEGER NOT NULL := 10; -- Объявить символ с -- значение по умолчанию "а". буква СИМВОЛ ПО УМОЛЧАНИЮ ''a''; НАЧИНАТЬ ответное письмо; КОНЕЦ;
Подробнее об этом подходе здесь.
6
SQL не поддерживает переменные, это возможно только в процедурных языках (в Postgres это, например, PL/pgSQL).
Путь к этому в простом SQL заключается в использовании CTE (которое также является кросс-платформенным решением и не привязано к какому-либо диалекту SQL):
с vars (foo) as ( значения («бар») ) выберите фу из варов;
, например, ввод постоянных значений, когда выбор обеспечивает ввод в таблицу вставки при копировании из промежуточной таблицы.
Для этого вам не нужна переменная:
вставить в target_table (c1, c2, c3) выберите col_1, col_2, "некоторое значение" из staging_table;
2
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
В этой статье рассматриваются переменные SQL с использованием операторов SET и Select SQL.
SQL Server предоставляет нам два метода в T-SQL для присвоения значения ранее созданной локальной переменной SQL. Первый метод — это оператор SET, стандартный оператор ANSI, который обычно используется для присвоения значения переменной. Второй оператор — это оператор SELECT. В дополнение к своему основному использованию для формирования логики, используемой для извлечения данных из таблицы базы данных или нескольких таблиц в SQL Server, оператор SELECT также может использоваться для присвоения значения ранее созданной локальной переменной напрямую или из переменной. представление или таблица.
Хотя обе инструкции T-SQL выполняют задачу присвоения значения переменной SQL, существует ряд различий между инструкциями SET и SELECT, которые могут привести к тому, что в определенных обстоятельствах вы предпочтете одну из них другой. В этой статье мы подробно опишем, когда и почему следует выбирать между операторами SET и SELECT T-SQL при присвоении значения переменной.
Мы начнем с создания новой таблицы и заполним ее несколькими записями для нашей демонстрации.
1 2 3 4 5 6 7 8 10 110005 12 13 14 2009111000 9000 900014 000 9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 21000 9000 9000 15 9000 9000 9000 9000 210009 9000 | USE SQLShackDemo GO CREATE TABLE SetVsSelectDemo ( ID INT IDENTITY (1,1) PRIMARY KEY, Name NVARCHAR (50005 Name NVARCHAR (50005 ID INT IDENTITY0005 GroupNumber INT, Grade INT ) GO INSERT INTO SetVsSelectDemo VALUES ('Adel',1,350) INSERT INTO SetVsSelectDemo VALUES ('Faisal',1,240) INSERT INTO SetVsSelectDemo VALUES ('Huda ', 2180) Вставка в значения SetVsSelectDemo (' ZAID ', 2170) INSERT в значения SETVSSelectDemo (' Zaina ', 3290) Вставка в значения SetVsSelectDemo (' John ', 4,400) аттрактирует «Игорь», 4375) |
Вставленные данные можно проверить с помощью следующего оператора SELECT:
ВЫБЕРИТЕ * ИЗ SetVsSelectDemo |
И данные будут показаны, как показано ниже:
Если нам удастся присвоить скалярное значение для переменной SQL, которая ранее была определена с помощью оператора DECLARE, оба оператора SET и SELECT достигнут цели в одном и том же путь. Приведенный ниже оператор SET используется для присвоения переменной @EmpName1 скалярного значения «Ali»:
DECLARE @EmpName1 NVARCHAR(50) PRINT @EmpName1 GO |
Таким же образом приведенный ниже оператор SELECT может использоваться для присвоения переменной @EmpName2 скалярного значения «Ali»:
DECLARE @EmpName2 NVARCHAR(50) SELECT @EmpName2 = 'Али' PRINT @EmpName2 GO |
Назначенные значения для переменных в предыдущих запросах будут напечатаны на вкладке Сообщения, как показано ниже:
SQL Server позволяет нам назначать значение для переменной SQL из таблицы или представления базы данных. Приведенный ниже запрос используется для присвоения переменной @EmpName значения столбца Name третьих членов группы из таблицы SetVsSelectDemo с помощью инструкции SET:
DECLARE @EmpName NVARCHAR(50) SET @EmpName = (ВЫБЕРИТЕ [Имя] ИЗ SetVsSelectDemo WHERE GroupNumber = 3) PRINT @EmpName GO |
Оператор SELECT можно также использовать для выполнения той же задачи присваивания другим способом, как показано ниже:
DECLARE @EmpName NVARCHAR(50) SELECT @EmpName = [Name] FROM SetVsSelectDemo WHERE GroupNumber = 3 PRINT @EmpName GO |
Результаты двух предыдущих запросов будут отображаться на вкладке «Сообщения», как показано ниже:
До этого момента вы можете видеть, что операторы SET и SELECT могут одинаково выполнять задачу присвоения значения переменной. и отличаются только со стороны кода.
Несколько переменных SQL
Предположим, что нам нужно присвоить значения нескольким переменным за один раз. Оператор SET может присваивать значение одной переменной за раз; это означает, что если нам нужно присвоить значения двум переменным, нам нужно написать два оператора SET. В приведенном ниже примере для каждой переменной требуется отдельный оператор SET, чтобы присвоить ей скалярное значение перед ее печатью:
1 2 3 4 5 6 | Объявление @empname1 nvarchar (50), @empname2 nvarchar (50) set @empname1 = 'ali' set @empname2 = 'fadi' print @empname1 print @empname2 go | 33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333н.
С другой стороны, оператор SELECT может использоваться для присвоения значений ранее определенным нескольким переменным SQL с помощью одного оператора SELECT. Приведенный ниже оператор SELECT можно легко использовать для присвоения скалярных значений двум переменным с помощью одного оператора SELECT перед его печатью:
Объявление @empname1 nvarchar (50), @empname2 nvarchar (50) select @empname1 = 'ali', @empname2 = 'fadi' print @empname1 print @empname2 go | 339592.
Из распечатанного ниже результата видно, что оба оператора решают одну и ту же задачу, причем оператор SELECT лучше, чем оператор SET, при попытке присвоить значения нескольким переменным из-за простоты кода:
Опять же, если мы попытаемся присвоить значения из таблицы базы данных нескольким переменным, это потребует от нас операторов SET, равных количеству переменных. В нашем примере нам нужны две инструкции SET для присвоения значений из таблицы SetVsSelectDemo переменным @EmpName и @EmpGrade, как показано в приведенном ниже сценарии:
. 1 2 3 4 5 6 | DECLARE @EmpName NVARCHAR(50), @EmpGrade INT SET @EmpName = (ВЫБЕРИТЕ [Имя] ИЗ SetVsSelectDemo, ГДЕ GroupNumber = 3) SET @EmpGrade = (ВЫБЕРИТЕ [Уровень] ИЗ SetVsSelectDemo, ГДЕ GroupNumber = 3) |
С другой стороны, только один оператор SELECT может использоваться для присвоения значений из таблицы SetVsSelectDemo переменным @EmpName и @EmpGrade SQL с использованием более простого запроса, как показано ниже:
Объявление @empname nvarchar (50), @empgrade int Select @empname = [name], @empgrade = [Grade] из setvsselectdemo, где GroupNumber = 3 Print @empname Print @empgrade Go |
Из двух предыдущих запросов очевидно, что запрос, использующий оператор SELECT, более эффективен, чем запрос, использующий оператор SET, при одновременном присвоении значений нескольким переменным из-за того, что оператор SET может назначать только одну переменную за раз. Аналогичные результаты двух предыдущих запросов, которые выводятся на вкладке «Сообщения», в нашем случае будут такими, как показано ниже:
Множественные значения
Второй момент, в котором проявляется разница между присвоением значений переменным SQL с помощью операторов SELECT или SET, — это когда набор результатов запроса подзапроса, который используется для присвоения значения переменная возвращает более одного значения. В этом случае оператор SET вернет ошибку, так как он принимает только одно скалярное значение из подзапроса, чтобы присвоить его переменной, в то время как оператор SELECT принимает ситуацию, в которой подзапрос вернет несколько значений, не вызывая никакой ошибки. Однако у вас не будет никакого контроля над тем, какое значение будет присвоено переменной, где переменной будет присвоено последнее значение, возвращенное из подзапроса.
Предположим, что нам нужно присвоить значение Name второй группы из ранее созданной таблицы SetVsSelectDemo переменной SQL @EmpName. Напомним, что вторая группа в этой таблице содержит две записи в результирующем наборе, как показано ниже:
Сценарий, который используется для присвоения значения переменной @EmpName из таблицы SetVsSelectDemo с помощью операторов SET и SELECT, будет выглядеть так:
1 2 3 4 5 6 7 8 9 | Объявление @empname nvarchar (50) set @empname = (select [name] из setvsselectdemo, где GroupNumber = 2) Print @empname Go Declare @empname Nvarchar (50) @emparare @empname nvarchar (50) EmpName = [Name] FROM SetVsSelectDemo WHERE GroupNumber = 2 PRINT @EmpName GO |
Из-за того, что оператор подзапроса вернул две записи, присвоение значения SQL-переменной @EmpName с помощью оператора SET не удастся, так как оператор SET может присвоить переменным только одно значение. Это не тот случай, когда присваивается значение переменной @EmpName с помощью инструкции SELECT, которая завершится успешно без ошибок, присваивая переменной имя из второй возвращенной записи, то есть «Zaid», как показано в сообщениях результатов ниже:
Из предыдущего результата мы можем узнать, что, когда вы ожидаете, что подзапрос вернет более одного значения, лучше использовать оператор SET для присвоения значения переменной путем реализации надлежащего механизма обработки ошибок, а не используя оператор SELECT, который присвоит последнее возвращенное значение переменной SQL, при этом не будет возвращена ошибка, предупреждающая нас о том, что подзапрос вернул несколько значений.
Не присваивать значения
Другое различие между присвоением значений переменным SQL с помощью операторов SET и SELECT заключается в том, что подзапрос, который используется для присвоения значения переменной, не возвращает никакого значения. Если ранее объявленная переменная не имеет начального значения, операторы SET и SELECT будут действовать одинаково, присваивая этой переменной значение NULL.
Предположим, что нам нужно присвоить переменной @EmpName без начального значения Имя пятой группы из таблицы SetVsSelectDemo. Напомним, что в этой таблице нет записей, относящихся к пятой группе, как показано ниже:
Сценарий, который используется для присвоения значения переменной @EmpName из таблицы SetVsSelectDemo, будет выглядеть так:
1 2 3 4 5 6 7 8 9 | DECLARE @EmpName NVARCHAR(50) SET @EmpName = (ВЫБЕРИТЕ [Имя] ИЗ SetVsSelectDemo WHERE GroupNumber = 5) ВЫБЕРИТЕ @EmpName AS SET_Name GO
DECLARE @EmpName NVARCHAR(50) SELECT @EmpName = [Name] FROM SetVsSelectDemo WHERE GroupNumber = 5 SELECT @EmpName AS SELECT_Name 5 |
При отсутствии начального значения для переменной @EmpName и значения, возвращаемого из подзапроса, этой переменной будет присвоено значение NULL в обоих случаях, как ясно показано в сообщении результата ниже:
Если ранее объявленное Переменная SQL имеет начальное значение, а подзапрос, который используется для присвоения значения переменной, не возвращает никакого значения, оператор SET и SELECT будут вести себя по-разному. В этом случае оператор SET переопределит начальное значение переменной и вернет значение NULL. Напротив, оператор SELECT не переопределит начальное значение переменной и вернет его, если значение не возвращается из присваивающего подзапроса.
Если мы снова присвоим переменной @EmpName Имя пятой группы из таблицы SetVsSelectDemo, напомнив, что в этой таблице нет записей, принадлежащих пятой группе, но на этот раз после установки начального значения для @ Переменная SQL EmpName во время объявления переменной с использованием операторов SET и SELECT, как показано в приведенном ниже сценарии:
1 2 3 4 5 6 7 8 9 | Declare @empname nvarchar (50) = 'sanya' set @empname = (select [name] из setvsselectdemo, где GroupNumber = 5) Select @Empname as set_name Go Declare @Empnam 50)='Саня' ВЫБЕРИТЕ @EmpName = [Имя] ИЗ SetVsSelectDemo WHERE GroupNumber = 5 ВЫБЕРИТЕ @EmpName КАК SELECT_Name ПЕРЕЙТИ |
Принимая во внимание, что присваивающий подзапрос не вернул значения, запрос, в котором использовалась инструкция SET для присвоения значения переменной SQL, переопределит начальное значение переменной, возвращая значение NULL, в то время как запрос, в котором использовалась инструкция SELECT для присвоение значения переменной сохранит начальное значение без изменений, поскольку значение не возвращается из подзапроса, как ясно показано в результатах ниже:
Заключение
SQL Server предоставляет нам два основных метода, которые используются для присвоения значений переменным SQL. В большинстве случаев операторы SET и SELECT без проблем выполняют задачу присвоения значения переменной. В некоторых ситуациях вы можете предпочесть использовать одно вместо другого, например:
- Если вам удается присвоить значения нескольким переменным напрямую или из таблицы базы данных, лучше использовать оператор SELECT, для которого требуется только один оператор, над оператором SET из-за простоты кодирования
- Если вы следуете стандарту ANSI для миграции кода, используйте оператор SET для назначения значений переменных SQL, так как оператор SELECT не соответствует стандарту ANSI
- Если присваивающий подзапрос возвращает несколько значений, использование оператора SET для присвоения значения переменной вызовет ошибку, поскольку он принимает только одно значение, тогда как оператор SELECT присвоит переменной последнее возвращенное значение из подзапроса без контроль с вашей стороны
- Если присваивающий подзапрос не возвращает никакого значения, инструкция SET заменит начальное значение переменной на NULL, в то время как инструкция SELECT не заменит ее начальное значение
- Автор
- Последние сообщения
Ахмад Ясин
Ахмад Ясин — инженер Microsoft по работе с большими данными, обладающий глубокими знаниями и опытом в области SQL BI, администрирования баз данных SQL Server и разработки.