|
Программирование >> Преобразование значений null
7654 7698 7782 Последний шаг - использовать результаты в подзапросе для возвращения необходимых строк. бить ее на отдельные числовые значения, используя предоставленные СУБД функции. DB2 и SQL Server Обход строки выполняет вложенный запрос Х (строки 6-11). Основная идея решения - пройти по строке так, чтобы в каждой следующей строке было на один символ меньше, чем в предыдущей: ,7654,7698,7782,7788, 7654,7698,7782,7788, 654,7698,7782,7788, 54,7698,7782,7788, 4,7698,7782,7788, ,7698,7782,7788, 7698,7782,7788, 698,7782,7788, 98,7782,7788, 8,7782,7788, ,7782,7788, 7782,7788, 782,7788, 82,7788, Обратите внимание, благодаря тому, что строка заключена в запятые (разделитель), нет необходимости в специальных проверках для определения начала или конца строки. Следующий шаг - выбрать только те значения, которые войдут в список оператора IN. Это значения, начинающиеся с запятой, за исключением последней строки, в которой запятая является единственным символом. С помощью функции SUBSTR или SUBSTRING находим такие строки и затем для каждой из них сохраняем все символы до следующей запятой. Когда это сделано, приводим строки к числовому типу, чтобы они могли быть помещены в числовой столбец EMPNO (строки 4-14): EMPNO MySQL Вложенный запрос (строки 5-9) осуществляет обход строки. Выражение в строке 10 определяет количество значений в строке, подсчитывая число запятых (разделителей) и добавляя к нему единицу. Функция SUBSTRING INDEX (строка 6) возвращает все символы строки до (слева) и-ной запятой (разделителя): +---------------------+ empno +---------------------+ 7654 7654,7698 7654,7698,7782 7654,7698,7782,7788 +---------------------+ Затем эти строки передаются в еще одну SUBSTRING INDEX (строка 5); на этот раз n-ным разделителем является первая запятая, поэтому сохранены будут все значения справа от n-ного разделителя: +-------+ empno +-------+ 7654 7698 +-------+ Последний шаг - вставить результаты в подзапрос. Oracle Первый шаг - обход строки: select emps,pos from (select ,7654,7698,7782,7788, emps from t1) csv, (select rownum pos from emp) iter where iter.pos <= ((length(csv.emps)-length(replace(csv.emps, ,)))/length(,))-1 EMPS POS ,7654,7698,7782,7788, 1 ,7654,7698,7782,7788, 2 ,7654,7698,7782,7788, 3 ,7654,7698,7782,7788, 4 Число возвращенных строк представляет количество значений в списке. Значения POS очень важны, потому что они необходимы в запросе для проведения синтаксического разбора строки. Синтаксический разбор строки осуществляется с помощью функций SUBSTR и INSTR. 7654, 7698, 7782, 7788, Последний шаг - удалить из каждого значения завершающую запятую, привести значение к числовому типу данных и поместить в подзапрос. PostgreSQL Обход строки осуществляет вложенный запрос Z (строки 6-9). Количество возвращаемых строк соответствует количеству значений в строке. Чтобы определить, сколько значений в строке, находим разность между размером строки с разделителями и ее размером без них (строка 9). Синтаксическим разбором строки занимается функция SPLIT PART. Она ищет значение, располагающееся перед и-ным разделителем: select list.vals, split part(list.vals ,iter.pos) as empno, iter.pos from (select id as pos from t10) iter, (select ,7654,7698,7782,7788, as vals from t1) list where iter.pos <= length(list.vals)-length(replace(list.vals ,)) vals empno pos ,7654,7698,7782,7788, 1 ,7654,7698,7782,7788, 7654 2 ,7654,7698,7782,7788, 7698 3 POS используется для определения местонахождения и-ного разделителя в каждой строке. Поскольку строки окружены запятыми, дополнительных проверок для определения начала или конца строки не требуется. Значения передаются в SUBSTR, INSTR (строки 7-9) находит и-й и и+1-й разделители. Вычитая значение, возвращенное для текущей запятой (местоположение текущей запятой в строке), из значения, возвращенного для следующей запятой (местоположение следующей запятой в строке), можно извлечь все значения строки: select substr(emps, instr(emps , 1,iter.pos)+1, instr(emps ,1,iter.pos+1) -instr(emps ,1,iter.pos)) emps from (select ,7654,7698,7782,7788, emps from t1) csv, (select rownum pos from emp) iter where iter.pos <= ((length(csv.emps)-length(replace(csv.emps )))/length(,))-1 EMPS
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |