Как я могу использовать условие И в IF EXISTS в SQL?

18
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'X' AND COLUMN_NAME = 'Y') 

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Z' AND COLUMN_NAME = 'A')
BEGIN
    UPDATE [dbo].[X] 
        SET Y= (SELECT inst.[A] FROM [dbo].[Z] s WHERE s.[B] = [dbo].[x].[B]);
END    
    GO

Я хочу объединить 2 IF-соглашения и выполнить обновление только тогда, когда они оба выполнены. Есть ли способ, которым я могу играть в клубе 2 IF EXISTS?

    
задан user811433 02.07.2013 в 01:00
источник

3 ответа

36

Простой:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'X' AND COLUMN_NAME = 'Y') 
AND EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Z' AND COLUMN_NAME = 'A')

BEGIN
    UPDATE [dbo].[X] 
        SET Y= (SELECT inst.[A] FROM [dbo].[Z] s WHERE s.[B] = [dbo].[x].[B]);
END    
GO
    
ответ дан Vlad G. 02.07.2013 в 01:02
источник
  • Или, фактически глядя на ваш код, он будет работать как написанный - второй IF будет вложен под 1-й. Просто добавьте вкладки :) –  Vlad G. 02.07.2013 в 01:04
  • Кроме того, вы должны включить TABLE_SCHEMA в свой запрос INFORMATION_SCHEMA.COLUMNS, иначе вы получите неправильный результат, если одно и то же имя таблицы существует в другой схеме. –  Vlad G. 02.07.2013 в 01:32
  • G, что, если столбец A или столбец Y не существует или удален? В этом случае я получаю сообщение об ошибке. Msg 207, уровень 16, состояние 1, строка 5 Недопустимое имя столбца «A». –  user811433 02.07.2013 в 19:48
  • user811433: если таблицы существуют, тогда SQL Server пытается «привязать» оператор, т. е. разрешить все ссылки на объекты и столбцы. И если столбцы не существуют, вы получаете ошибку. В этом случае вам нужно сделать динамический SQL: EXEC ('UPDATE [dbo]. [X] SET Y = (SELECT inst. [A] FROM [dbo]. [Z] s WHERE s. [B] = [dbo] . [х] [В]); ".) –  Vlad G. 02.07.2013 в 20:07
  • Когда я пытаюсь использовать динамический SQL, как выше, я вижу более или менее ту же ошибку, что и раньше. Идентификатор с несколькими частями «s.A» не может быть связан. –  user811433 02.07.2013 в 20:15
6

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

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
              WHERE TABLE_NAME = 'X' AND COLUMN_NAME = 'Y')

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
          WHERE  TABLE_NAME = 'Z' AND COLUMN_NAME = 'A')

    BEGIN
        UPDATE [dbo].[X] 
            SET Y= (SELECT inst.[A] FROM [dbo].[Z] s WHERE s.[B] = [dbo].[x].[B]);
    END    
        GO
    
ответ дан Mudassir Hasan 02.07.2013 в 04:40
источник
  • Вы никогда не получите запись из своего запроса, если каким-либо образом TABLE_NAME может одновременно быть как «X», так и «Z». Повторите для COLUMN_NAME. Кроме того, поскольку вы проверяете наличие строк, сделайте SELECT 1 вместо этого, чтобы сделать запрос быстрее. SQL Server умнее этого. –  ta.speot.is 02.07.2013 в 04:42
  • да ..... получил, И должен быть заменен на ИЛИ? –  Mudassir Hasan 02.07.2013 в 04:43
  • Нет, тогда UPDATE будет работать, если существуют X.Y или Z.A, а не оба. –  ta.speot.is 02.07.2013 в 04:44
  • спасибо за исправления ... –  Mudassir Hasan 02.07.2013 в 04:45
  • Что касается производительности, как я понимаю, список выбора для EXISTS-запроса проверяется только при построении плана запроса, но не влияет на выполнение. Оптимизатор запросов просто строит план, который проверяет наличие строки, удовлетворяющей указанным требованиям. Для хранимой процедуры с кэшированным планом не беспокойтесь об этом. Хотя мое личное предпочтение заключается в выборе 42, вы обнаружите, что 1/0 или NULL работают так же хорошо. Даже 30 / -3 / 5, что обычно приводило бы к ошибке с делением на нуль, работает. –  HABO 02.07.2013 в 05:38
0

Измените название и описание пустым

UPDATE 'li_categories'
  SET description = CASE
    WHEN description = '' THEN CONCAT('optional text ', title, ' optional text')
    ELSE description
    END
WHERE
 id
    
ответ дан Limitless isa 24.11.2015 в 15:26
источник