Teradata SQL在文本字段中选择多个大写字母的字符串

时间:2017-06-29 15:05:28

标签: sql teradata

在弄清楚如何在混合大写和小写字母的文本字段中识别缩略语时,将非常感谢任何帮助。
例如,我们可能有 “我们在鸡肉上使用烧烤酱” 我需要我的查询来选择“烧烤”而不是单元格中的任何其他内容。 每行可以有多个大写字符串 输出应包含uppcase字符串。

非常感谢任何想法!!

3 个答案:

答案 0 :(得分:1)

这有点难看。我尝试使用REGEXP_SPLIT_TO_TABLE来取出所有大写单词,但无法使其正常工作。

首先使用strtok_split_to_table,我会这样做,因此每个单词都会以自己的行结束。

首先,一些虚拟数据:

create volatile table vt 
(id integer,
col1 varchar(20))
on commit preserve rows;

insert into vt
values (1,'foo BAR');

insert into vt
values (2,'fooBAR');

insert into vt
values(3,'blah FOO FOO blah');

我们可以在这上面使用strtok_split_to_table:

select
t.*
from table
(strtok_split_to_table(vt.id ,vt.col1,' ')
returns
(tok_key integer 
,tok_num INTEGER
,tok_value VARCHAR(30)
)) AS t

这将使用空格作为分隔符将每个值拆分为单独的行。

最后,我们可以将每个值与大写的值进行比较:

select
vt.id,
vt.col1,
tok_key,
tok_num,
tok_value,
case when upper(t.tok_value) = t.tok_value (CASESPECIFIC) then tok_value else '0' end
from
(
select
t.*
from table
(strtok_split_to_table(vt.id ,vt.col1,' ')
returns
(tok_key integer 
,tok_num INTEGER
,tok_value VARCHAR(30)
)) AS t
) t
inner join vt
    on t.tok_key = vt.id
order by id,tok_num

获取我们可爱的样本数据,您将获得:

+----+-------------------+---------+---------+-----------+-------------+
| id |       col1        | tok_key | tok_num | tok_value | TEST_OUTPUT |
+----+-------------------+---------+---------+-----------+-------------+
|  1 | foo BAR           |       1 |       1 | foo       | 0           |
|  1 | foo BAR           |       1 |       2 | BAR       | BAR         |
|  2 | fooBAR            |       2 |       1 | fooBAR    | 0           |
|  3 | blah FOO FOO blah |       3 |       1 | blah      | 0           |
|  3 | blah FOO FOO blah |       3 |       2 | FOO       | FOO         |
|  3 | blah FOO FOO blah |       3 |       3 | FOO       | FOO         |
|  3 | blah FOO FOO blah |       3 |       4 | blah      | 0           |
+----+-------------------+---------+---------+-----------+-------------+

答案 1 :(得分:1)

将首字母缩略词定义为带有'\b[A-Z]{2,5}\b'正则表达式的2到5个字符的所有大写单词:

WITH cte AS
 ( -- using @Andrew's Volatile Table 
   SELECT * 
   FROM vt
   -- only rows containing acronyms
   WHERE RegExp_Similar(col1, '.*\b[A-Z]{2,5}\b.*') = 1 
 )
SELECT
   outkey,
   tokenNum,
   CAST(RegExp_Substr(Token, '[A-Z]*') AS VARCHAR(5)) AS acronym -- 1st uppercase word 
   --,token
FROM TABLE
    ( RegExp_Split_To_Table
        ( cte.id,
          cte.col1,

             -- split before an acronym, might include additional characters after
             -- [^A-Z]*? = any number of non uppercase letters (removed)
             -- (?= ) = negative lookahead, i.e. check, but don't remove
          '[^A-Z]*?(?=\b[A-Z]{2,5}\b)',

          '' -- defaults to case sensitive
        ) RETURNS
            ( outKey INT,
              TokenNum INT,
              Token VARCHAR(30000) -- adjust to match the size of your input column 
            )
    ) AS t
WHERE acronym <> ''

答案 2 :(得分:0)

我不是100%确定你想要做什么,但我认为你有很多选择。即:

选项1)检查字符串中是否存在首字母缩略词(如BBQ)(基本语法)

SELECT CHARINDEX ('BBQ',@string)

在这种情况下,您需要一个包含您要检查的所有已知缩略语的表,然后循环遍历每个缩写词以查看您的字符串是否匹配,然后返回首字母缩略词。

DECLARE @string VARCHAR(100)
SET @string = 'we used the BBQ sauce on the Chicken'

create table : [acrs]
--+--- acronym-----+
--+    BBQ         +
--+    IBM         +
--+    AMD         +
--+    ETC         +
--+----------------+

SELECT acronym FROM [acrs] WHERE CHARINDEX ([acronym], @string ) > 0)

这应该返回:&#39; BBQ&#39;

选项2)将所有大写字符加载到临时表等中,以便进一步进行逻辑和处理。我想你可以用这样的东西......

DECLARE @string VARCHAR(100)
SET @string = 'we used the BBQ sauce on the Chicken'

-- make table of all Upper case letters and process individually
;WITH cte_loop(position, acrn)
 AS (
        SELECT 1, SUBSTRING(@string, 1, 1)
        UNION ALL
        SELECT position + 1, SUBSTRING(@string, position + 1, 1)
        FROM cte_loop
        WHERE position < LEN(@string) 
 )
SELECT position, acrn, ascii(acrn) AS [ascii]
FROM cte_loop
WHERE ascii(acrn) > 64 AND ascii(acrn) < 91 -- see the ASCII table for all codes

这将返回如下表:

enter image description here