обновить до null, если условие не выполняется

#sql #sql-server #sql-update

#sql #sql-сервер #sql-обновить

Вопрос:

Исходные данные

  ------- ---------------- ---------------- ---------------- 
| SeqNo |      Name      |   NameReason   |    NameDate    |
 ------- ---------------- ---------------- ---------------- 
|     1 | IronMan        | 'emptystring'' | 2019-03-01     |
|     2 | 'emptystring'' | 'emptystring'' | 'emptystring'' |
|     3 | IronMan        | 'emptystring'' | 'emptystring'' |
|     4 | IronMan        | A              | 'emptystring'' |
|     5 | 'emptystring'' | A              | 'emptystring'' |
|     6 | 'emptystring'' | 'emptystring'' | 2019-03-01     |
|     7 | IronMan        | A              | 2019-03-01     |
|     8 | 'emptystring'' | A              | 2019-03-01     |
 ------- ---------------- ---------------- ---------------- 
  

Требуемые результаты:

  ------- ---------------- ------------ ------------ 
| SeqNo |      Name      | NameReason |  NameDate  |
 ------- ---------------- ------------ ------------ 
|     1 | NULL           | NULL       | NULL       |
|     2 | NULL           | NULL       | NULL       |
|     3 | NULL           | NULL       | NULL       |
|     4 | NULL           | NULL       | NULL       |
|     5 | NULL           | NULL       | NULL       |
|     6 | NULL           | NULL       | NULL       |
|     7 | IronMan        | A          | 2019-03-01 |
|     8 | 'emptystring'' | A          | 2019-03-01 |
 ------- ---------------- ------------ ------------ 
  

Запрос:

 update #A
set NAME=NULL, NameReason=NULL, NameDate=NULL
where NAME<>'' OR NameReason=" OR NameDate <>''
  

Из приведенного выше запроса выполнено только для SeqNo = 7, как я могу выполнить для SeqNo8?

Как я могу обновить другие строки до null, если они не соответствуют условию. Для name: (принимает только пустую строку или символ), Для nameReason: (принимает только символ), для namedate: (принимает только дату).

Работа с записями 10mils, 30cols. Не может быть жестко.

Ответ №1:

Как я могу обновить другие строки до null, если они не соответствуют условию. Для name: (принимает только пустую строку или символ), Для nameReason: (принимает только символ), для namedate: (принимает только дату).

Похоже, вас вообще не волнует name, потому что вы готовы принять, что это либо emptystring, либо not-emptystring

Таким образом, я думаю, что ваше обновление просто должно быть:

 update #A
set NAME=NULL, NameReason=NULL, NameDate=NULL
where NameReason=" OR NameDate=''
  

Это также может быть записано как:

 update #A
set NAME=NULL, NameReason=NULL, NameDate=NULL
where not (NameReason=" and NameDate='')
  

например, «обнулить каждую запись, где namereason или namedate пусты» / «обнулить каждую запись, в которой отсутствует значение как в namereason, так и в namedate»

Комментарии:

1. вы правы. Почему я не могу додуматься до этой идеи. facepalm теперь я сам.

2. Иногда я смотрю на что-то так долго, что тоже не могу этого увидеть. Иногда ответ приходит ко мне, когда я пишу вопрос SO, чтобы четко объяснить себя другому человеку. Иногда это не так, поэтому я просто нажимаю post и жду некоторых указателей — я думаю, в любом случае, ЭТО решает мою проблему 🙂

Ответ №2:

Пожалуйста, попробуйте это.

 Update #A
set NAME=NULL, NameReason=NULL, NameDate=NULL
where NAME='' OR NameReason='' OR NameDate = ''