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