2010-02-01 107 views
3

我在一次采访中被问到,来自oracle sql.this的一个问题似乎是一个简单的问题,但我无法回答。有人帮忙吗?只选择varchar字段中的第一个字母

如果有像“纽约是一个美丽的城市”在一个柱子的字符串。

select column_name from table_name; 

将导致

newyork is a beautiful city 

什么是给输出与所有的第一个字母串所需的查询。 即输出应该是

niabc 
+2

只是出于好奇:是否有一个原因“a”被排除在输出之外(即为什么不是“niabc”?),或者是面试问题的一部分,以删除文章? – 2010-02-01 04:39:30

+3

如果你真的需要这样做,SQL完全是它的错误工具。虽然你可以编写一些单一的递归查询,但你可以用另一种语言的简单循环来实现同样的事情(可能快得多),你可以在用户定义的函数中使用它。 – lins314159 2010-02-01 04:42:15

+0

对不起,我的错误...我忘了:) :) – Vijay 2010-02-01 04:42:31

回答

6

只要你不在乎是否有保持输出的情况下,这可以非常简单地完成,而无需递归:

SQL> select 
    2  translate(
    3   initcap('newyork is a BEAUTIFUL city') 
    4    , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz' 
    5    , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
    6    ) 
    7 from dual 
    8/

TRANS 
----- 
NIABC 

SQL> 

如果句子中包含数字,标点等那么我们将不得不将这些字符添加到第一个替换字符串中,这可能会非常乏味。

+0

这是非常优秀的答案,这就是我正在... ...一个简单的SQL查询:)非常感谢。 – Vijay 2010-02-01 08:44:19

1

也许这将涉及使用功能substr

+0

这是无效的原因? – 2010-02-01 04:37:32

+0

只有当你知道你需要的角色位置时才会使用substr。但你不知道这个词究竟在哪里。并添加到这...这不应该是一个答案,评价者应该是一个comment.so -1从我 – Vijay 2010-02-01 04:38:06

+0

你有我的upvote,@AJ :-)我从来没有使用Oracle,但从快速搜索它似乎'substr'或'regex_substr'都可以工作,任何一个都可以和另一个一样有效,而这些似乎是解决问题的唯一真正选择。也许一位Oracle大师会告诉我们关于'get_first_letter_of_every_word_please'函数的所有错误;-) – 2010-02-01 04:48:56

5

答案是使用REGEX_SUBSTR

查看文档here, 和一个关闭示例here

+0

+1对我来说很新鲜。感谢提示。 – 2010-02-01 04:45:22

2

您可以使用描述为here的分割函数(用空格替换逗号),以便按空格拆分句子。然后,你可以像AJ那样使用substr函数,因为split的结果可以让你从char 1开始到每个“piece”的char 2。

它涉及到substr毕竟是吧?

PS。我宁愿在上面的层中处理结果,而不是在查询过程中。但那是我。