設定 - SQLから列の大文字を検索する




sqlserver initcap (5)

REGEXP_REPLACE関数のおかげでこれを実現することができます:

SELECT REGEXP_REPLACE(my_column, '(^[A-Z]| |[a-z][A-Z]*|[A-Z]*[a-z])', '') AS Result FROM my_table

これは、行の最初の大文字のcharを置き換え、空白ですべての小文字のcharとspaceを変換する正規表現を使用します。

私は私のテーブルに説明の列があり、その値は次のとおりです。

This is a EXAMPLE
This is a TEST
This is a VALUE

説明列からEXAMPLE、TEST、およびVALUEのみを表示したいとします。

これをどのように達成するのですか?


これは、正規表現の回答に基づいた関数です。

create or replace function capwords(orig_string varchar2)
return varchar2
as
out_string varchar2(80);
begin
  out_string := REGEXP_REPLACE(orig_string, '([a-z][A-Z_]*|[A-Z_]*[a-z])', '');
  out_string := REGEXP_REPLACE(trim(out_string), '(  *)', ' ');
  return out_string;
end;
/

大文字の文字列と、両端に小文字のあるアンダースコアを削除します。 隣接する複数のスペースを1つのスペースに置き換えます。 端から余分なスペースを取り除きます。 80文字の最大サイズを仮定します。

わずかに編集された出力:

>select id,str,capwords(str) from test;

        ID STR                            CAPWORDS(STR)
---------- ------------------------------ ------------------
         1 This is a EXAMPLE              EXAMPLE
         2 This is a TEST                 TEST
         3 This is a VALUE                VALUE
         4 This IS aN EXAMPLE             IS EXAMPLE
         5 This is WITH_UNDERSCORE        WITH_UNDERSCORE
         6 ThiS IS aN EXAMPLE             IS EXAMPLE
         7 thiS IS aN EXAMPLE             IS EXAMPLE
         8 This IS wiTH_UNDERSCORE        IS

これは方法かもしれません:

-- a test case
with test(id, str) as (
select 1, 'This is a EXAMPLE' from dual union all
select 2, 'This is a TEST' from dual union all
select 3, 'This is a VALUE' from dual union all
select 4, 'This IS aN EXAMPLE' from dual
)
-- concatenate the resulting words
select id, listagg(str, ' ') within group (order by pos)
from (
    -- tokenize the strings by using the space as a word separator
    SELECT id,
           trim(regexp_substr(str, '[^ ]+', 1, level)) str,
           level as pos           
      FROM test t
    CONNECT BY instr(str, ' ', 1, level - 1) > 0
      and prior id = id
      and prior sys_guid() is not null
    )
-- only get the uppercase words
where regexp_like(str, '^[A-Z]+$')   
group by id

アイデアは、すべての文字列をトークン化し、大文字ではない単語を切り捨て、残りの単語を連結することです。

結果:

1    EXAMPLE
2    TEST
3    VALUE
4    IS EXAMPLE

他の文字を大文字で扱う必要がある場合は、 where条件を編集して一致する単語をフィルタリングすることができます。 たとえば、 '_'を使用します。

with test(id, str) as (
select 1, 'This is a EXAMPLE' from dual union all
select 2, 'This is a TEST' from dual union all
select 3, 'This is a VALUE' from dual union all
select 4, 'This IS aN EXAMPLE' from dual union all
select 5, 'This IS AN_EXAMPLE' from dual
)
select id, listagg(str, ' ') within group (order by pos)
from (
    SELECT id,
           trim(regexp_substr(str, '[^ ]+', 1, level)) str,
           level as pos           
      FROM test t
    CONNECT BY instr(str, ' ', 1, level - 1) > 0
      and prior id = id
      and prior sys_guid() is not null
    )
where regexp_like(str, '^[A-Z_]+$')   
group by id

与える:

1   EXAMPLE
2   TEST
3   VALUE
4   IS EXAMPLE
5   IS AN_EXAMPLE

これを試して:

SELECT SUBSTR(column_name, INSTR(column_name,' ',-1) + 1)
FROM your_table;

列の値を変更せずに結果を「表示」する必要がある場合は、 CASE WHENを使用できます(この例では列名です)。

Select CASE WHEN Description like '%EXAMPLE%' then 'EXAMPLE' WHEN Description like '%TEST%' then 'TEST' WHEN Description like '%VALUE%' then 'VALUE' END From [yourTable]

大文字で書いても大文字小文字は区別されません。 値のいずれも含まない説明がある場合は、 END Else '<Value if all conditions are wrong>'前にElse '<Value if all conditions are wrong>'を追加することができます。 この例ではNULLが返され、 ELSE Descriptionはその行の元の値を返します。

更新が必要な場合にも機能します。 それはシンプルで実用的な、簡単な方法、ハハです。







oracle