![](/img/trans.png)
[英]SQL Server 2008: How to select all rows where field has all capital letters?
[英]Teradata SQL select string of multiple capital letters in a text field
在弄清楚如何識別混合了大小寫字母的文本字段中的首字母縮略詞時,任何幫助將不勝感激。
例如,我們可能有“ 我們在雞肉上使用了燒烤醬 ”,我需要查詢以選擇“ BBQ”,而單元格中沒有其他內容。 每行可能有多個大寫字符串。輸出應包含uppcase字符串。
任何想法都非常感謝!
這將是丑陋的。 我嘗試使用REGEXP_SPLIT_TO_TABLE只是大寫字母,但無法正常工作。
我會先使用strtok_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 |
+----+-------------------+---------+---------+-----------+-------------+
使用'\\b[AZ]{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 <> ''
我不確定您要做什么,但我不確定您有很多選擇。 即:
選項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)
這應該返回:'BBQ'
選項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
這將返回表,如下所示:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.