Как переименовать результат запроса с некоторыми условиями - PullRequest
0 голосов
/ 04 февраля 2019

В результате моего запроса у меня есть 3 значения в столбце.Мне нужно было бы сократить и вернуть значения столбца.Например,Скажем, мой результат - Всемирный торговый центр, мне нужно, чтобы он был напечатан как WTC

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Я не уверен, что пошло не так раньше и что я делал сейчас.Но я попытался использовать Case Expression, и теперь это сработало.Спасибо всем за ваш вклад.

0 голосов
/ 04 февраля 2019

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

DECLARE @return VARCHAR(30)
DECLARE @loop INT
DECLARE @myString VARCHAR(30)

SET @return = '' -- The variable that will be returned
SET @myString = 'World Trade Center' -- Your original value
SET @loop = LEN(@myString) - LEN(REPLACE(@myString,' ','')) + 1 -- Calculate the    nombre of spaces to know how many times to loop

DECLARE @count INT = 1;

WHILE @count <= @loop -- While u haven't parsed all words of the original string
BEGIN
   SET @return = SUBSTRING(PARSENAME(REPLACE(@myString, ' ', '.'), @count), 1, 1) + @return -- Add the first letter of each word to the return variable
   SET @count = @count + 1;
END;

SELECT @return -- And there you got 'WTC', you can use it as you want

Добавление первой буквы каждого слова в @return может выглядеть странно, так как выглядит так, как если бы буквы добавлялись в обратном порядке., но на самом деле это работает нормально, по крайней мере, на SQL Server

0 голосов
/ 04 февраля 2019

Как насчет регулярного выражения?

SQL> with test (col) as
  2    (select 'World Trade Centre ' from dual union all
  3     select 'Additional Voluntary Contribution' from dual union all
  4     select 'Executive Pension Plan' from dual union all
  5     select 'Money Purchase Plan' from dual
  6    )
  7  select
  8    col,
  9    listagg(substr(regexp_substr(col, '\w+', 1, column_value), 1, 1), '')
 10      within group (order by column_value) result
 11  from test,
 12       table(cast(multiset(select level from dual
 13                           connect by level <= regexp_count(col, ' ') + 1
 14                          ) as sys.odcinumberlist))
 15  group by col;

COL                               RESULT
--------------------------------- ----------
Additional Voluntary Contribution AVC
Executive Pension Plan            EPP
Money Purchase Plan               MPP
World Trade Centre                WTC

SQL>

Что это делает?

  • разбить каждую строку на строки (это то, что делает REGEXP_SUBSTR в строке 9)
  • выбрать первую букву каждой подстроки (это то, что делает SUBSTR в строке 9)
  • объединяет эти первые буквы в результат (это то, что делает LISTAGG)
0 голосов
/ 04 февраля 2019

Вы можете использовать для этого выражения case:

select (case when col = 'World Trade Center' then 'WTC'
             . . .
         end) as abbrev

Потребность в чем-то подобном фактически предполагает, что вам нужна справочная таблица для любого объекта, которым он является.Вы можете обнаружить, что несколько запросов в конечном итоге делают одно и то же - и затем, если добавляется четвертое значение, нужно изменить много кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...