作为查询的结果,我在列中有3个值。我需要缩写并返回列值。例如。说我的结果是 世界贸易中心 我需要将其打印为WTC
答案 0 :(得分:0)
您可以为此使用case
表达式:
select (case when col = 'World Trade Center' then 'WTC'
. . .
end) as abbrev
实际上,对这样的需求表明您想要一个实体的引用表。您可能会发现多个查询最终会做同一件事-然后,如果添加第四个值,则需要更改许多代码。
答案 1 :(得分:0)
这就是我为您准备的内容,它在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上这样可以正常工作
答案 2 :(得分:0)
一些正则表达式怎么样?
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
就是这样)SUBSTR
的作用)LISTAGG
就是这样)答案 3 :(得分:0)
我不确定较早前出了什么问题,现在又做了什么。但是我已经尝试使用Case Expression,现在它可以工作了。 谢谢大家的投入。