Insert sql с условием: Изучаем инструкцию INSERT INTO SQL

Пример условной инструкции INSERT FIRST






Без рубрики
sql oracle
·
25.07.2021
·


Для всех сотрудников в таблице EMPLOYEES сведения о сотруднике, соответствующие условию, вставляются в первую целевую таблицу.

Как показано в приведенном примере, если оклад сотрудника равен 2000, запись вставляется только в таблицу SAL_LOW.

Инструкция SQL приводится далее.

Условная инструкция INSERT FIRST

С помощью инструкции SELECT в таблицу EMPLOYEES извлекаются по каждому сотруднику сведения, такие как идентификатор сотрудника, фамилия и оклад. Все записи сотрудников, соответствующие условию, вставляются в первую целевую таблицу.

Эта инструкция INSERT называется условной инструкцией INSERT FIRST. Сначала проверяется условие WHEN salary < 5000. Если значение этого первого предложения равно True, сервером Oracle выполняется соответствующее предложение INTO и вставляется запись в таблицу SAL_LOW. Для данной строки сервер пропускает последующие предложения WHEN.

Если строка не удовлетворяет первому условию WHEN (WHEN salary < 5000), проверяется следующее условие (WHEN salary between 5000 and 10000). Если значение этого условия равно True, запись вставляется в таблицу SAL_MID, а последнее условие пропускается.

Если ни первое условие (WHEN salary < 5000), ни второе условие (WHEN salary between 5000 and 10000) не соблюдаются, сервером Oracle выполняется соответствующее предложение INTO для предложения ELSE.

Всего было вставлено 20 строк:

SELECT count(*) low FROM sal_low; SELECT count(*) mid FROM sal_mid; SELECT count(*) high FROM sal_high;

Далее: Функция FROM_TZ


Post Views: 29




Похожие записи



Без рубрики
sql oracle
·
25. 04.2023
·


Используя предложение WITH, можно определить блок запроса до его применения в запросе. Предложение WITH (формально называется subquery_factoring_clause) позволяет многократно использовать один и тот же блок запроса в инструкции SELECT, когда она встречается более одного раза в сложном запросе. Это особенно… Читать далее



Без рубрики
mikl
·
22.04.2023
·


Оператор WITH в SQL — это чрезвычайно полезный инструмент для создания временных таблиц и использования их внутри других запросов. Это позволяет упростить код и улучшить производительность запросов. Оператор WITH (также известный как Common Table Expression) используется для создания временных таблиц,… Читать далее



Без рубрики
sql oracle
·
15.04.2022
·


Внешняя таблица не описывает никаких данных, которые хранятся в базе данных. Внешняя таблица не описывает порядок хранения данных во внешнем источнике. Вместо этого она описывает, как уровень внешней таблицы должен представлять данные для сервера. За преобразования, которые требуется выполнять над… Читать далее



Без рубрики
sql oracle
·
15.04.2022
·


Позволяет восстанавливать таблицы до состояния на заданный момент времени с помощью одной инструкции. Восстанавливает табличные данные вместе со связанными индексами и ограничениями. Позволяет возвращать таблицу и ее содержимое в состояние, существовавшее на определенный момент времени, или к изменению системы, определенному… Читать далее



Без рубрики
sql oracle
·
04.04.2022
·


Внешние таблицы создаются с помощью предложения ORGANIZATION EXTERNAL инструкции CREATE TABLE. В действительности таблица не создается. Точнее, создаются метаданные в словаре данных, который можно использовать для доступа к внешним данным. Предложение ORGANIZATION применяется для указания порядка, в котором сохраняются строки… Читать далее



Без рубрики
sql oracle
·
04.04.2022
·


В базе данных Oracle имеется функция для удаления таблиц. При удалении таблицы база данных не сразу освобождает пространство, занимаемое таблицей. Точнее, база данных переименовывает таблицу и помещает ее в корзину, где таблица позже может быть восстановлена с помощью инструкции FLASHBACK… Читать далее



Без рубрики
sql oracle
·
18.03.2022
·


Рассмотрим, как создаются внешние таблицы посредством драйвера доступа ORACLE_LOADER. Предположим, что существует текстовый файл, в котором имеются записи в следующем формате:      10,jones,11-Dec-1934 20,smith,12-Jun-1972 Записи разделяются символом новой строки, и все поля заканчиваются запятой ( , ). Имя файла: /emp_dir/emp.dat. … Читать далее



Без рубрики
sql oracle
·
18.03.2022
·


Используя драйвер доступа ORACLE_DATAPUMP, можно выполнять с внешними таблицами операции выгрузки и повторной загрузки. Примечание. В контексте внешних таблиц загрузка данных обозначает операцию чтения данных из внешней таблицы и их загрузку в таблицу базы данных. Под выгрузкой данных понимается чтение… Читать далее



Без рубрики
sql oracle
·
12.02.2022
·


Можно настроить много аспектов интерфейса и среды SQL Developer, изменяя предпочтения SQL Developer согласно Вашим потребностям. Чтобы изменить предпочтения SQL Developer, выберите Tools, а затем Preferences. Настройте интерфейс SQL Developer и среду. В меню Tools выберите Preferences. Предпочтения группируется в… Читать далее



Без рубрики
sql oracle
·
12. 02.2022
·


В этой рубрике было рассмотрено использование SQL Developer, чтобы выполнять следующие задачи: Просматривать, создавать и редактировать объекты базы данных Выполнять SQL-операторы и сценарии на Рабочем листе SQL Создавать и сохранять пользовательские отчеты SQL Developer является бесплатным графическим инструментом, позволяющим упростить… Читать далее


Условие WHERE в SQL — CodeChick

В этой статье вы научитесь выбирать данные из таблицы с определенным условием с помощью WHERE.

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

Условие WHERE используется с операторами SELECT, UPDATE и DELETE. В этой статье мы остановимся на использовании WHERE с SELECT.

Синтаксис

Условие WHERE используется с оператором SELECT для извлечения только тех записей, которые удовлетворяют заданным условиям.

Базовый синтаксис выглядит так:

SELECT список_столбцов FROM имя_таблицы WHERE условие;

список_столбцов — это имена столбцов/полей, таких как имя, возраст, страна и т.д. таблицы базы данных, значения которых вы хотите получить.

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

SELECT * FROM имя_таблицы WHERE условие;

Операторы для условий

Для условий используются операторы сравнения: =!=><>= и <=.

ОператорОписаниеПример
=РавноWHERE id = 2
>Больше чемWHERE age > 30
<Меньше чемWHERE age < 18
>=Больше или равноWHERE rating >= 4
<=Меньше или равноWHERE price <= 100
LIKEСопоставление паттернаWHERE name LIKE 'An'
INПроверяет, совпадает ли указанное значение с любым значением в списке или подзапросеWHERE country IN ('RUSSIA', 'BELARUS')
BETWEENПроверяет, находится ли указанное значение в данном диапазоне значенийWHERE rating BETWEEN 3 AND 5

Используем WHERE

В прошлой статье мы тренировались на датасете Austin_Animal_Center_Intakes. csv (Google Disc →). Скачайте и установите таблицу в свою СУБД.

Допустим, мы хотим узнать все месяцы, в которых было принято более 1 000 особей одного вида животных. Это поможет сделать следующий SQL-запрос:

 SELECT year,
        month,
        animal_type,
        count
   FROM austin_animal_center_intakes_by_month
  WHERE COUNT > 1000

Результат:

yearmonthanimal_typecount
20165Dog1,020
20155Cat1,009
20156Cat1,103
20156Dog1,014

Вы также можете использовать WHERE с = и != для ограничения результатов для текстовых полей. Например, если нужно просмотреть информацию только о кошках, взятых в центр животных Остина, можно выполнить такой запрос:

SELECT year,
       month,
       count,
       animal_type
  FROM austin_animal_center_intakes_by_month
 WHERE animal_type = "Cat"

Примечаение. Для числовых значений сравниваемое число (1000 в первом примере) не заключено в кавычки. При сравнении текстовых строк сравниваемый текст должен быть заключен в двойные кавычки («Cat» во втором примере). Запросы с текстовыми строками также чувствительны к регистру. Если выполнить второй запрос с «cat» вместо «Cat», то SQL ничего не найдет.

Результат:

yearmonthcountanimal_type
201310542Cat
201511488Cat
201512320Cat
20161304Cat
20162279Cat
20141335Cat
20163333Cat

Примечание. Результаты запросов с использованием символов >, <, >= и <= для столбцов со строковыми значениями могут оказаться неожиданными. Текстовые строки рассматриваются как числа с алфавитным порядком — больше строка или меньше определяется именно по нему. Если мы выполним запрос к таблице Intakes для всех типов животных > "Cat", результаты будут включать всех собак («Dog» > «Cat»), диких животных («Wildlife» > «Cat») и других животных («Other» > «Cat»), но не кошек («Cat» > «Cat» → false, т. к. «Cat» = «Cat»).

Условные вставки

с использованием SQL Условные вставки

с использованием SQL

Легко выполнить условную вставку, используя язык сервера по вашему выбору, но сделать это исключительно с помощью кода SQL не так просто. В большинстве популярных серверов баз данных есть некоторые языковые дополнения и нестандартный код SQL, но условная вставка может быть выполнена с использованием прямого SQL, что делает его независимым от платформы. Это полезно при написании сценариев SQL для выполнения обновлений базы данных. Запуск скрипта без условной вставки может создать проблемы, например, если скрипт запускается дважды. В этой статье будет показана техника, которую я использую при выполнении условной вставки с использованием MS Access, MS SQL Server и MySQL. В примерах будет использоваться образец базы данных Northwind, доступный для Access и MS SQL из коробки, а также для MySQL с использованием сценария, загружаемого с моего сайта. Сценарии можно запускать из административного интерфейса базы данных по вашему выбору.

Вставка данных

Типичная вставка в скрипт может выглядеть так:

ВСТАВИТЬ В ПРОДУКЦИЮ
(ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
ЦЕННОСТИ

(«Новый продукт», 12, 1, 1, 9,99, 1000, 0, 100, 0)

Этот сценарий вставит одну строку в таблицу «Продукты». Что произойдет, если скрипт будет запущен дважды? Вы получите 2 одинаковых продукта в базе данных. Подобный сценарий может быть передан вашим пользователям для реализации. Если это часть более крупного сценария и в сценарии есть какие-либо ошибки, пользователь может попытаться запустить его снова, создав две вставки одних и тех же данных о продукте. Что нам нужно, так это способ ограничить это одним разом.

Использование ВЫБОР

Оператор SELECT может быть написан для возврата статических данных — не из какой-либо таблицы:

ВЫБЕРИТЕ «Новый продукт», 12, 1, 1, 9,99, 1000, 0, 100, 0

Обратите внимание, что в этом операторе нет предложения FROM. Оператор SELECT просто возвращает данные. Это вернет набор результатов, используя те же данные, которые использовались в операторе INSERT выше.

Оператор INSERT может использовать оператор SELECT как способ предоставления данных для вставки. Это утверждение верно:

ВСТАВИТЬ В ПРОДУКЦИЮ
(ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
ВЫБЕРИТЕ «Новый продукт», 12, 1, 1, 9,99, 1000, 0, 100, 0

Поля расположены в том же порядке, поэтому данные вставляются так, как вы ожидаете. Что нам нужно, так это предложение WHERE, чтобы ограничить вставку только вставкой данных, если данные не существуют. Однако мы не можем этого сделать:

ВСТАВИТЬ В ПРОДУКЦИЮ
(ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
ВЫБЕРИТЕ «Новый продукт», 12, 1, 1, 9,99, 1000, 0, 100, 0
ГДЕ «Новый продукт» НЕ В (ВЫБЕРИТЕ ProductName FROM Products)

Поскольку предложение FROM отсутствует, предложение WHERE создает синтаксическую ошибку. Однако вы можете выбрать статические данные из таблицы, даже если данные не возвращаются. Это юридический синтаксис:

ВЫБЕРИТЕ «Новый продукт», 12, 1, 1, 9.99, 1000, 0, 100, 0
ИЗ ПРОДУКЦИИ

Это вернет те же данные, однако они выбираются из таблицы «Продукты». Никакие данные из фактической таблицы не возвращаются, однако возвращаются все строки таблицы, поскольку ограничений нет. Другими словами, эти статические данные будут возвращены один раз для каждой строки в таблице. Мы можем использовать предложение DISTINCT, чтобы избежать этого:

SELECT DISTINCT ‘Новый продукт’, 12, 1, 1, 9.99, 1000, 0, 100, 0
ИЗ ПРОДУКТОВ

Это возвращает одну строку, которую мы хотим. Однако попробуйте это с предложением WHERE, которое кажется логичным, и вы увидите, что оно не работает:

SELECT DISTINCT ‘Новый продукт’, 12, 1, 1, 9.99, 1000, 0, 100, 0
ИЗ ПРОДУКЦИИ
ГДЕ «Новый продукт» НЕ В (ВЫБЕРИТЕ ProductName FROM Products)

Будет возвращена одна строка независимо от того, существуют ли уже данные или нет. Нам нужно предложение WHERE, которое вернет 0 строк, если данные уже существуют. Следующий оператор вернет 1, если данные существуют, и 0, если данные не существуют:

ВЫБЕРИТЕ СЧЕТ(*) ИЗ ПРОДУКТОВ
WHERE ProductName <> ‘Новый продукт’

Теперь все, что нам нужно, это способ отфильтровать исходную вставку по этому номеру. Мы можем использовать число 1 для сравнения в нашем предложении WHERE, создавая оператор INSERT, который работает так, как мы хотим, вставляя новую строку, если данные не существуют, и не добавляя данные, если они уже существуют:

ВСТАВИТЬ В ПРОДУКЦИЮ
(ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
SELECT DISTINCT «Новый продукт», 12, 1, 1, 9,99, 1000, 0, 100, 0
ИЗ ПРОДУКЦИИ
ГДЕ 1 >
(ВЫБЕРИТЕ COUNT(*) FROM Products WHERE ProductName <> ‘Некоторый новый продукт’)

Зависит от базы данных

Предложение DISTINCT — не самый эффективный способ выполнить эту вставку, если имеется много данных, поэтому следующие операторы создадут тот же результат, используя синтаксис, специфичный для базы данных:

MS Access и MS SQL

ВСТАВИТЬ В ПРОДУКЦИЮ
(ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
ВЫБЕРИТЕ НАЧАЛО 1 «Новый продукт», 12, 1, 1, 9,99, 1000, 0, 100, 0
ИЗ ПРОДУКЦИИ
ГДЕ 1 >
(ВЫБЕРИТЕ COUNT(*) FROM Products WHERE ProductName <> ‘Некоторый новый продукт’)

MySQL

ВСТАВИТЬ ИГНОР В ПРОДУКТЫ
(ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
ВЫБЕРИТЕ «Новый продукт», 12, 1, 1, 9,99, 1000, 0, 100, 0
ИЗ ПРОДУКЦИИ
ГДЕ НЕ СУЩЕСТВУЕТ
(ВЫБЕРИТЕ 1 ИЗ ПРОДУКТОВ, ГДЕ ProductName = ‘Некоторые новые продукты’) LIMIT 1

Заключение

Немного творчески подойдя к SQL, вы сможете решить большинство проблем с базой данных на уровне базы данных.

Как сделать условную вставку SQL Server

Судип Бхатт

2246
Очки репутации

2020-12-12T18:14:20.983+00:00

Теперь я вставляю данные в таблицу A из таблицы B. Вот пример динамического SQL, который вставляет данные в таблицу #TmpZacksCons из #TmpAll_Broker_LI

 SET @sql='Insert Into #TmpZacksCons (Раздел, Строка,Орд,
 '+@PeriodCols+'
 )
 Выберите b.Section, b.LineItem,Max(Ord)+1 Ord,
 '+@AvgSql+'
  От #TmpAll_Broker_LI b
  Группировать по b.Section, b.LineItem'
 EXEC(@sql)
 

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

я хочу выбрать из таблицы A и проверить, является ли тип записей средним , затем выберите данные из #TmpAll_Broker_LI
, если тип записей Median , затем выберите записи из #TmpAll_Broker_LI_Median 9000 3

, поэтому в моем вышеприведенном sql я буду выберите и проверьте тип записи, если медиана, затем выберите данные из #TmpAll_Broker_LI_Median иначе, если идентификатор типа записи Среднее значение , затем выберите данные из #TmpAll_Broker_LI

, так скажите мне, как я могу составить этот динамический sql, где данные на основе типа записей будут извлечены из другой таблицы, и эти данные будут вставлены в динамической таблице #TmpZacksCons.

, пожалуйста, помогите мне с образцом sql. спасибо

Редактировать

Мое требование.

за каждую вставку в TmpZacksCons я хочу проверить, каково значение Type из Table3 . если значение среднее, то выберите данные из table2 и вставьте в TmpZacksCons , а если тип Median, выберите данные из table3 и вставьте в TmpZacksCons таблицу. пожалуйста, дайте мне код соответственно с образцом кода.

Спасибо

Войдите, чтобы подписаться

0 комментариев
Без комментариев

0
{count} голосов


Войдите, чтобы комментировать

Сортировать по:

Самый полезный

Самые полезные Самые новые Самые старые

  1. Виорел

    93 526
    Очки репутации

    2020-12-12T19:54:05.147+00:00

    Рассмотрим и этот подход:

     вставить в #TmpZacksCons ( столбцы )
    выберите столбцы из таблицы A, внутреннее соединение #TmpAll_Broker_LI на … и a. [type] = ‘average’
    союз всех
    выберите столбцы из таблицы A, внутреннее соединение #TmpAll_Broker_LI_Median on … и a.[type] = ‘Median’
     

    1 человек считает этот ответ полезным.


    Войдите, чтобы комментировать

  2. Эрланд Соммарског

    76 931
    Очки репутации • MVP

    2020-12-13T19:20:02.467+00:00

    ВЫБЕРИТЕ (ТИП СЛУЧАЯ, КОГДА «Среднее», ТОГДА ВЫБЕРИТЕ столбцы 1, столбцы 2 ИЗ Таблицы 1
    КОГДА «Медианы», ТОГДА ВЫБЕРИТЕ столбцы 1, столбцы 2 ИЗ Таблицы 2)

    Нет, этого делать нельзя. THEN должно сопровождаться скалярным выражением. То есть у вас не может быть нескольких столбцов или строк. Но предполагая, что Type находится в какой-то другой таблице, вы могли бы сделать:

     ВЫБЕРИТЕ u.col1, u.col2
    FROM OtherTable ot
    ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ (ВЫБРАТЬ t1.col1, t1.col2
                 ИЗ Таблица1 t1
                 ГДЕ ot. Type = 'Среднее'
                 СОЮЗ ВСЕХ
                 ВЫБЕРИТЕ t2.col1, t2.col2
                 ИЗ Таблица2 t2
                 ГДЕ ot.Type = 'Средний') AS u
     

    Войдите, чтобы комментировать

  3. Мелисса Ма-MSFT

    24 136
    Очки репутации

    2020-12-14T06:01:16.677+00:00

    Привет @Sudip Bhatt,

    Пожалуйста, обратитесь ниже и проверьте, полезно ли это для вас. Спасибо.

     объявить @sql nvarchar (макс.)
      объявить @PeriodCols nvarchar (макс.)
      объявить @AvgSql nvarchar (макс.)
      
      объявить @type nvarchar (макс.)
      выберите тип @type= из таблицы A, где ...
      
      SET @sql='Вставить в #TmpZacksCons (раздел, LineItem, Ord,
      '+@PeriodCols+'
      )
      Выберите b.Section, b.LineItem,Max(Ord)+1 Ord,
      '+@AvgSql+'
       Из '+ случая, когда @type='Average', затем '#TmpAll_Broker_LI'
       когда @type='Median', тогда '#TmpAll_Broker_LI_Median' end + ' b
       Группировать по b. Section, b.LineItem'
       исполнить(@sql)
     

    С наилучшими пожеланиями
    Мелисса


    Если ответ полезен, нажмите « Принять ответ » и проголосуйте за него .
    Примечание. Чтобы включить уведомления по электронной почте, выполните действия, описанные в нашей документации, если вы хотите получать соответствующие уведомления по электронной почте для этой темы.

    Горячие проблемы Ноябрь —Что делать, если мой журнал транзакций заполнен?
    Горячие проблемы Ноябрь — Как преобразовать трассировку Profiler в таблицу SQL Server


    Войдите, чтобы комментировать

  4. Мелисса Ма-MSFT

    24 136
    Очки репутации

    2020-12-15T03:09:19.567+00:00

    Привет @Sudip Bhatt,

    для каждой вставки в TmpZacksCons. Я хочу проверить значение Type из Table3. если значение «Среднее», выберите данные из таблицы 2 и вставьте в TmpZacksCons, а если тип — «Медиана», выберите данные из таблицы 3 и вставьте в таблицу TmpZacksCons. пожалуйста, дайте мне код соответственно с образцом кода.

    Было бы лучше, если бы вы опубликовали DDL и образцы данных для всех таблиц (TmpZacksCons, table2 и table3), чтобы мы могли предложить лучшее решение.

    См. ниже обновленный вариант:

     declare @sql nvarchar(max)
    объявить @PeriodCols nvarchar (макс.)
    объявить @AvgSql nvarchar (макс.)
          
    объявить @type nvarchar (макс.)
    выберите тип @type= из таблицы 3 --where --добавьте сюда свое условие
          
    SET @sql='Вставить в #TmpZacksCons (раздел, LineItem, Ord,
    '+@PeriodCols+'
    )
    Выберите b.Section, b.LineItem,Max(Ord)+1 Ord,
    '+@AvgSql+'
    Из '+
    случай, когда @type='Average', затем 'Table2'
    когда @type='Median', тогда 'Table3' end + ' b
    Группировать по b.Section, b.LineItem'
    исполнить(@sql)
     

    С наилучшими пожеланиями
    Мелисса


    Если ответ полезен, нажмите « Принять ответ » и проголосуйте за него .