Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проверка, что поле - строковое, и не содержит пустую строку / 13 сообщений из 13, страница 1 из 1
11.06.2014, 15:57:48
    #38667808
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
Генерирую запрос на "деликатное" копирование данных из одной таблицы в другую - заполняются только поля, содержащие NULL или пустую строку. Список полей генерируется скопом, добавлять туда фильтрацию и проверки не хочется. Всего полей может быть до полутора десятков.

Задача:
В запросе для любых полей определить, что поле содержит пустую строку.

Проблемы:
1) Поля нестроковых типов при сравнении с '' выбрасывают ошибку
2) CAST требует указания длины, т.е. нельзя преобразовать в "Строку произвольного размера" - а значит, длина должна быть такой, чтобы влезло самое длинное поле.

Пока додумался только до такого варианта:
Код: sql
1.
2.
3.
4.
UPDATE aTable
  SET aField = IIF((aField IS NOT NULL) AND (CAST(aField AS VARCHAR(32765)) <> ''), aField, :aField),
  ...
  WHERE ...



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

Может, кто-то посоветует решение поэлегантнее?
...
Рейтинг: 0 / 0
11.06.2014, 16:01:05
    #38667818
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
upd
- FB 2.5
- запрос нечастый, не страшно, если будет тормозить (в разумных пределах, конечно)
...
Рейтинг: 0 / 0
11.06.2014, 16:11:59
    #38667841
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
Fr0sT-BrutalМожет, кто-то посоветует решение поэлегантнее?
MERGE+CASE
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.06.2014, 16:12:51
    #38667844
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
Проверку, что поле менять не надо, следует добавить в WHERE.
Ибо нефиг апдейтить само себя, лишнее это.
...
Рейтинг: 0 / 0
11.06.2014, 16:19:28
    #38667851
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
WildSery
В WHERE не получится. Обновить надо конкретную запись, но, возможно, не все поля.

Dimitry Sibiryakov
Спасибо, гляну
...
Рейтинг: 0 / 0
11.06.2014, 16:20:37
    #38667853
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
WildSery
или ты имеешь в виду выполнять по одному update на каждое поле? Это перебор :)
...
Рейтинг: 0 / 0
11.06.2014, 16:28:23
    #38667861
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
Dimitry Sibiryakov
просьба пояснить. Пока не могу определить, чем может помочь MERGE. Насколько я понял, он просто упаковывает update и insert в одну конструкцию. Но мне как раз не нужно вставлять, а только обновлять по условию. А вопрос как раз в условии, как проверить, что поле надо обновлять.
...
Рейтинг: 0 / 0
11.06.2014, 16:31:36
    #38667869
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
Fr0sT-BrutalСписок полей генерируется скопом, добавлять туда фильтрацию и проверки
не хочется.
А в чём проблема-то добавить туда проверку на тип поля?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.06.2014, 16:33:15
    #38667871
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
Fr0sT-Brutalпросьба пояснить. Пока не могу определить, чем может помочь MERGE.

Код: sql
1.
2.
merge into aTable using bTable on ...
when match set aField=coalesce(aTable.aField, bTable.aField);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.06.2014, 17:42:07
    #38667962
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
авторА в чём проблема-то добавить туда проверку на тип поля?..
Хотелось шуровать все в запрос без дополнительных ветвлений.
авторmerge into aTable using bTable on ...
when match set aField=coalesce(aTable.aField, bTable.aField);
Так coalesce только на нуллы работает же.
...
Рейтинг: 0 / 0
11.06.2014, 17:45:12
    #38667966
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
Fr0sT-Brutal,

ну так добавь ещё NULLIF(aTable.aField, '')
...
Рейтинг: 0 / 0
11.06.2014, 17:49:17
    #38667973
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
Fr0sT-BrutalХотелось шуровать все в запрос без дополнительных ветвлений.
Боишься пальцы стереть, набирая на две строчки кода больше?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.06.2014, 18:23:07
    #38668013
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка, что поле - строковое, и не содержит пустую строку
Симонов Денис
Хороший вариант, но на не-строковых не сработает (conversion error from string)

Dimitry Sibiryakov
Любопытно узнать, решаема ли задача исключительно средствами sql
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проверка, что поле - строковое, и не содержит пустую строку / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]