2017-04-18 168 views
-2
fnd YGY LOOKUP_TYPE = 'welcome' HELO HIASDH LOOKUP_TYPE = 'home' hello how are you? 

以上是字符串,我想输出如何从字符串中提取子字符串?

welcome 
home 
+0

想要得到用单引号括起来的文字吗?或者文本和字符串正是您需要搜索的内容? – BriteSponge

+0

请张贴更多的样本数据和期望的结果来阐明您的需求。另外,你到目前为止尝试过什么? – Aleksej

+0

基本上我想查找lookup_type的值。 –

回答

3

查询1

注:单引号需要在文字文本进行转义:

WITH test_data (string) AS (
    SELECT 'LOOKUP_TYPE = ''welcome'' LOOKUP_TYPE = ''home''' 
    FROM DUAL 
) 
SELECT SUBSTR(string, quote1 + 1, quote2 - quote1 - 1) AS first_quoted_string, 
     SUBSTR(string, quote3 + 1, quote4 - quote3 - 1) AS second_quoted_string, 
FROM (
    SELECT string, 
     INSTR(string, '''', 1, 1) AS quote1, 
     INSTR(string, '''', 1, 2) AS quote2, 
     INSTR(string, '''', 1, 3) AS quote3, 
     INSTR(string, '''', 1, 4) AS quote4 
    FROM test_data 
) 

输出

FIRST_QUOTED_STRING SECOND_QUOTED_STRING 
------------------- -------------------- 
welcome    home 

查询2

注:另类text literal报价demiliters q'[your string]'使用,使得单引号不需要进行转义

WITH test_data (string) AS (
    SELECT q'[LOOKUP_TYPE = 'welcome' LOOKUP_TYPE = 'home']' 
    FROM DUAL 
), 
quotes (string, quote_start, quote_end, lvl) AS (
    SELECT string, 
     INSTR(string, '''', 1, 1), 
     INSTR(string, '''', 1, 2), 
     1 
    FROM test_data 
    WHERE INSTR(string, '''', 1, 2) > 0 
UNION ALL 
    SELECT string, 
     INSTR(string, '''', 1, 2 * lvl + 1), 
     INSTR(string, '''', 1, 2 * lvl + 2), 
     lvl + 1 
    FROM quotes 
    WHERE INSTR(string, '''', 1, 2 * lvl + 2) > 0 
) 
SELECT SUBSTR(string, quote_start + 1, quote_end - quote_start - 1) AS quoted_string 
FROM quotes 

输出

QUOTED_STRING 
------------- 
welcome 
home 

查询3 - 正则表达式

注:用于获取输入:your_string绑定变量(你也可以使用文本文字代替)

WITH test_data (string) AS (
    SELECT :your_string FROM DUAL 
), 
quotes (string, quoted_string, lvl, max_lvl) AS (
    SELECT string, 
     REGEXP_SUBSTR(string, q'[LOOKUP_TYPE\s*=\s*("|''?)(.*?)\1]', 1, 1, NULL, 2), 
     1, 
     REGEXP_COUNT(string, q'[LOOKUP_TYPE\s*=\s*("|''?)(.*?)\1]') 
    FROM test_data 
    WHERE REGEXP_COUNT(string, q'[LOOKUP_TYPE\s*=\s*("|''?)(.*?)\1]') > 0 
UNION ALL 
    SELECT string, 
     REGEXP_SUBSTR(string, q'[LOOKUP_TYPE\s*=\s*("|''?)(.*?)\1]', 1, lvl + 1, NULL, 2), 
     lvl + 1, 
     max_lvl 
    FROM quotes 
    WHERE lvl < max_lvl 
) 
SELECT quoted_string 
FROM quotes 

输出

QUOTED_STRING 
------------- 
welcome 
home 
+0

你为什么改变字符串? 请保持字符串与我张贴的相同,并在我的字符串中没有双引号只有单引号有 –

+0

@HimanshAgarwal如果你想[字符串中的单引号''(http://stackoverflow.com/q/2875257/1509264),它需要使用第二个单引号''''转义 - 字符串在输出中每个位置只有一个单引号。字符串的文本与答案的有效性无关 - 如果您希望将其与您的文本一起使用,则只需将其替换(转义单引号)即可。 – MT0

+0

老兄,这是我的字符串 FDGF YGY LOOKUP_TYPE ='welcome'HELO HIASDH LOOKUP_TYPE ='主页'你好吗? 我不能改变我的字符串中的任何东西。 –

1
with t (col) as (select q'[fnd YGY LOOKUP_TYPE = 'welcome' HELO HIASDH LOOKUP_TYPE = "home" hello LOOKUP_TYPE = ''man'' how are you?]' from dual) 

select rtrim(regexp_replace(col,q'[(.*?LOOKUP_TYPE\s*=\s*(''|'|")(.*?)\2|.+)]','\3,'),',') as lookup_types 
from t 

+------------------+ 
| LOOKUP_TYPES | 
+------------------+ 
| welcome,home,man | 
+------------------+ 
+0

查询3 - 正则表达式:正在工作,我想这个解决方案应该也适用于这个DSFSFSDFSDFSD LOOKUP_TYPE =“XXX_ASD”ASAD HELO HIASDH LOOKUP_TYPE =''XX_DSAS'' –

+0

我想你想评论另一个答案 –

+0

你能做吗我想要的是? –

相关问题