лучший способ перебрать столбцы в таблице SQL? - PullRequest
0 голосов
/ 22 мая 2018

У меня есть таблица.

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

Например:

Table1
column1, column2, column3, column4, column5

column1, column2 и column3 содержат данные, а column4 и column5 содержат пробелы.

Таким образом, мой процесс превратит column4 и column5 из пробелов в NULL.

Пример 2:

Table1
column1, column2, column3, column4, column5

column1, column2, column3 и column4 содержат данные, а column5 содержит пробелы.

Таким образом, мой процесс превратит column5 из пустого в NULL.

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

У кого-нибудь есть какие-либо советы о том, как выполнить итерацию по каждому столбцу таблицы?Я знаю, как перебирать строки в таблице, но я никогда не перебирал столбцы в таблице.

Спасибо

Ответы [ 4 ]

0 голосов
/ 23 мая 2018

Это может работать для вас, если в ваших данных уже нет NULL s:

create table t4 (
    id int identity(1,1) not null primary key clustered,
    v1 varchar(10) null,
    v2 varchar(10) null,
    v3 varchar(10) null,
    v4 varchar(10) null
)

insert t4 (v1, v2, v3, v4)
values  ('a', 'b', 'c', 'd'),
        ('a', 'b', 'c', ''),
        ('a', 'b', '', ''),
        ('a', '', '', ''),
        ('', '', '', '')

update  t4
set     v4 = case when v4 = '' then null else v4 end,
        v3 = case when v3 + v4 = '' then null else v3 end,
        v2 = case when v2 + v3 + v4 = '' then null else v2 end,
        v1 = case when v1 + v2 + v3 + v4 = '' then null else v1 end

До:

+----+----+----+----+----+
| id | v1 | v2 | v3 | v4 |
+----+----+----+----+----+
|  1 | a  | b  | c  | d  |
|  2 | a  | b  | c  |    |
|  3 | a  | b  |    |    |
|  4 | a  |    |    |    |
|  5 |    |    |    |    |
+----+----+----+----+----+

После:

+----+------+------+------+------+
| id |  v1  |  v2  |  v3  |  v4  |
+----+------+------+------+------+
|  1 | a    | b    | c    | d    |
|  2 | a    | b    | c    | NULL |
|  3 | a    | b    | NULL | NULL |
|  4 | a    | NULL | NULL | NULL |
|  5 | NULL | NULL | NULL | NULL |
+----+------+------+------+------+
0 голосов
/ 22 мая 2018

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

Допустим, я пишу заявление об обновлении таблицы вашего примера, думаю, что-то вроде этого:

UPDATE table1
SET column5 = CASE WHEN column5 = '' THEN NULL ELSE column5 END 
   ,column4 = CASE WHEN column5 = '' AND column4 = '' THEN NULL ELSE column4 END
   ,column3 = CASE WHEN column5 = '' AND column4 = '' AND column3 = '' THEN NULL ELSE column3 END

... И так далее - единственный способ, которым столбец 4 обнуляется, - это если пустые поля 4 и 5.

Если вы используете sys.tables & sys.columns вы можете получить column_id и работать в обратном направлении ... вероятно.Конечным результатом, о котором я думаю, будет динамический оператор SQL, который затем будет выполнен.

Это интересная проблема, и не та, которую я видел раньше - какой вариант использования?

0 голосов
/ 23 мая 2018

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

Например, обновите столбец 2,3,3,5, если данныесуществует только в столбце 1 и пусто в столбце 2.

Я могу только думать, что обновление будет таким:

UPDATE TABLE1
SET COLUMN2 = NULL,
        COLUMN3 = NULL,
        COLUMN4 = NULL,
        COLUMN5 = NULL
WHERE COLUMN2 = ''

UPDATE TABLE1
SET  COLUMN3 = NULL,
        COLUMN4 = NULL,
        COLUMN5 = NULL
WHERE COLUMN3 = ''

UPDATE TABLE1
SET  COLUMN4 = NULL,
        COLUMN5 = NULL,
WHERE COLUMN4 = ''

UPDATE TABLE1
SET  COLUMN5 = NULL
WHERE COLUMN5 = ''
0 голосов
/ 22 мая 2018

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

Как насчет этого вместо этого?Он установит всю таблицу в одном выражении.

Update Table1
set column1 = nullif(column1, '')
    , column2 = nullif(column2, '')
    , column3 = nullif(column3, '')
    , column4 = nullif(column4, '')
    , column5 = nullif(column5, '')

- РЕДАКТИРОВАТЬ -

С моим новым пониманием, возможно, вам нужно что-то подобное.Но это довольно большой признак того, что здесь что-то не так.Порядок столбцов в таблице не должен иметь никакого значения.Похоже, вы повторяете группы здесь, что нарушает 1NF.Но без реальных деталей невозможно сказать наверняка.

Update Table1
set column1 = nullif(column1, '')
    , column2 = nullif(column1 + column2, '')
    , column3 = nullif(column1 + column2 + column3, '')
    , column4 = nullif(column1 + column2 + column3 + column4, '')
    , column5 = nullif(column1 + column2 + column3 + column4 + column5, '')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...