如何使用sql查询以相反顺序显示数据?

如何使用sql查询以相反顺序显示数据?,sql,oracle,Sql,Oracle,假设我已将数据存储在名称列中为sb,我希望使用SQL查询将数据显示为bs。另一个例子:布朗丹原始数据,布朗丹显示数据 名字和姓氏没有存储在单独的列中,因此我无法理解如何容纳空格。我还想使这个查询成为通用查询,所以我想为中间名(如果有的话)添加一些规定。 我想到了类似的方法:选择SUBSTR | | | | |。。。 如何从字符串末尾开始读取并调整间距?您可以使用regexp\u substr提取两个名称: 您也可以按顺序使用这些表达式。以下是我对问题的理解: SQL> with test

假设我已将数据存储在名称列中为sb,我希望使用SQL查询将数据显示为bs。另一个例子:布朗丹原始数据,布朗丹显示数据

名字和姓氏没有存储在单独的列中,因此我无法理解如何容纳空格。我还想使这个查询成为通用查询,所以我想为中间名(如果有的话)添加一些规定。 我想到了类似的方法:选择SUBSTR | | | | |。。。
如何从字符串末尾开始读取并调整间距?

您可以使用regexp\u substr提取两个名称:


您也可以按顺序使用这些表达式。

以下是我对问题的理解:

SQL> with test (col) as
  2    (select 'S B' from dual union all
  3     select 'Dan Brown' from dual union all
  4     select 'Marco van Basten' from dual
  5    )
  6  select col,
  7         listagg(val, ' ') within group (order by rn desc) result
  8  from (select col,
  9               column_value rn,
 10               regexp_substr(col, '[^ ]+', 1, column_value) val
 11        from test cross join
 12             table(cast(multiset(select level from dual
 13                                 connect by level <= regexp_count(col, ' ') + 1
 14                                ) as sys.odcinumberlist))
 15      )
 16  group by col;

COL              RESULT
---------------- --------------------
Dan Brown        Brown Dan
Marco van Basten Basten van Marco
S B              B S

SQL>
它有什么作用

第8-14行用于将每个名称拆分为单独的行 交叉联接与表函数一起使用,以避免重复 名称中的这些行和部分按rn desc的相反顺序通过listagg函数聚合回来
如果单词之间用一个空格隔开,则可以使用任意多的单词。否则,您首先必须确保只有一个空格。

您可以使用此函数,我使用此函数:

SELECT CONCAT(SUBSTR(name_column,5,9),CONCAT(' ',SUBSTR(name_column,1,4))) FROM 
TABLE_NAME;
例如:

SELECT CONCAT(SUBSTR('Dan Brown',5,9),CONCAT(' ',SUBSTR('Dan Brown',1,4))) FROM DUAL;
或者,如果您有不同的名称或标题列,则也可以使用此列: 选择regexp_substrname,[^]+',1,1作为第一个_名称,
regexp_substrname,“[^]+”,1,2作为第二个_名称

我假设您仍然希望在一列中显示名称,但显示firstname lastname而不是lastname firstname。这里有一条路

select 
substr(name,instr(name,' ')+1)||' '||substr(name,1,instr(name,' ') -1) as fullname
from  your_table;

每个名字都是由一个空格分隔的两个单词吗?不,中间也可以有一个名字。比如丹·迈克尔·布朗。将显示为Brown Michael Dan。请不要发布代码的图像。以文本形式发布,就像您已经做的一样。
select 
substr(name,instr(name,' ')+1)||' '||substr(name,1,instr(name,' ') -1) as fullname
from  your_table;