PLSQL для изменения данных столбца VARCHAR2 - PullRequest
2 голосов
/ 26 марта 2011

Я работаю над приложением, которое включает оценку изменений, внесенных в транспортные средства, и выполняет некоторые расчеты на основе цифр, хранящихся в базе данных Oracle 10g. К сожалению, у меня есть только текстовые данные в базе данных, но мне нужно работать с числами, а не с текстом. Я хотел бы знать, может ли кто-нибудь помочь мне понять, как выполнять строковые операции над данными столбца VARCHAR2 в базе данных Oracle 10g с PLSQL:

Например: мне нужно взять столбец VARCHAR2 с именем TOP_SPEED в таблице с именем CARS, проанализировать текстовые данные в этом столбце, чтобы разбить их на два новых значения, и вставить эти новые значения в два новых столбца типа NUMBER в Таблица CARS, TOP_SPEED_KMH и TOP_SPEED_MPH.

Данные в столбце TOP_SPEED таковы: например, «153 км / ч (94,62 миль в час)»

Я хочу сохранить значение 153,00 в столбце TOP_SPEED_KMH, а значение 94,62 - в столбце TOP_SPEED_MPH.

Я думаю, что в запросе / скрипте мне нужно сделать следующее:

  1. выделение текстовых данных в TOP_SPEED в локальную текстовую переменную
  2. изменить локальную текстовую переменную и сохранить новые значения в две числовые переменные
  3. записать обратно две числовые переменные в соответствующие столбцы TOP_SPEED_KMH и TOP_SPEED_MPH

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

Приветствия

Ответы [ 6 ]

1 голос
/ 05 апреля 2011

with s as
     (select '153 km/h (94.62 mph)'  ts from dual)
select 
   ts,
   to_number(substr(ts, 1, instr(ts, ' ') -1)) speed_km,
   to_number(substr(regexp_substr(ts, '\([0-9]+'), 2))  speed_mph
 from s

1 голос
/ 29 марта 2011

Я работаю над приложением, которое включает оценка изменений, внесенных в транспортные средства, и делает некоторые число хруст из фигур, хранящихся в База данных Oracle 10g. К сожалению, Я только текстовые данные в базе данных, пока что мне нужно работать с числами и не текст

Похоже, у вас должно быть несколько числовых столбцов для хранения этих проанализированных значений. Вместо того, чтобы всегда вызывать некоторую подпрограмму синтаксического анализа (будь то регулярное выражение или substr или пользовательская функция), пропустите все данные в таблицах (ОДНАЖДЫ) и заполните новые числовые поля. Вам также следует изменить процесс ETL, чтобы заполнить новые числовые поля, двигаясь вперед.

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

1 голос
/ 29 марта 2011

Я думаю, что лучше иметь столбец top_speed_kmh и избавиться от mph.Поскольку количество километров в миле никогда не меняется, вы можете просто умножить на 0,6, чтобы пересчитать в мили.Таким образом, вы можете выполнить ту же инструкцию по обновлению, что и предложенный N West, без столбца mph: UPDATE CARS SET TOP_SPEED_KMH = TO_NUMBER (SUBSTR (1, (INSTR (UPPER (TOP_SPEED), "KM / H") -1)));

И всякий раз, когда вам нужна скорость в милях в час, просто выберите top_speed_kmh * 0.6 в качестве top_speed_mph из автомобилей;

1 голос
/ 29 марта 2011

Скорее всего, вам даже не нужно делать это с PL / SQL.

Пока данные в столбце соответствуют "99,99 км / ч (99,99 м / ч)", вы можетесделать это напрямую с помощью SQL:

UPDATE CARS
SET TOP_SPEED_KMH = TO_NUMBER(SUBSTR(1, (INSTR(UPPER(TOP_SPEED), "KM/H") - 1))),
    TOP_SPEED_MPH = <similar substr/instr combination to pull the 99.99 mph out of code>;

Операции над множествами обычно выполняются намного быстрее, чем процедурные операции.

1 голос
/ 26 марта 2011

Для бита синтаксического разбора вы, вероятно, будете использовать REGEXP_SUBSTR или INSTR с SUBSTR

Затем использовать TO_NUMBER для преобразования в число

Вы можете создать функцию PL / SQL для каждого синтаксического анализа,возвращая числовое значение, и выполните запрос UPDATE для полей, или вы можете создать процедуру PL / SQL с курсором, циклически повторяющим все данные, которые должны быть обновлены.

Вот ссылки сом для некоторых извстроенные модули:

http://psoug.org/reference/substr_instr.html http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/functions116.htm

0 голосов
/ 10 апреля 2011

Спасибо всем, было приятно иметь возможность использовать всеобщую информацию, чтобы получить ответ ниже:

UPDATE CARS
  SET 
    CAR_TOP_SPEED_KPH = 
      to_number(substr(CAR_TOP_SPEED, 1, instr(UPPER(CAR_TOP_SPEED), ' KM/H') -1)), 
    CAR_TOP_SPEED_MPH = 
      to_number(substr(regexp_substr(CAR_TOP_SPEED, '\([0-9]+'), 2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...