2016-12-15 10 views
0

私の会社のExcelシートでデータをフィルタリングしようとしています。 私が必要とする3つのフィールドは、FIRST_NAME,LAST_NAMECOMPANY_NAMEです。WHERE文字アルファベットのみの文字

次のように規則がある:

  • FIRST_NAME AND LAST_NAMECOMPANY_NAMENOT NULL
あるIF NOT NULL
  • FIRST_NAME AND LAST_NAMEことが
  • のみアルファベットでなければならない必要があり、上記の規則は無関係です

    顧客はFIRST_NAMELAST_NAME(いずれかまたは両方を欠くことはできません)が必要ですが、COMPANY_NAMEの場合はFIRST_NAMEおよび/またはLAST_NAMEを持たないことが許可されています。ここで

    は、いくつかの例のデータだと、彼らはデータかどうかに滞在する必要がある場合:私は「

    SELECT VR_CUSTOMERS.CUSTOMER_ID, VR_CUSTOMERS.FIRST_NAME, VR_CUSTOMERS.LAST_NAME, VR_CUSTOMERS.COMPANY_NAME, ... 
    FROM DEV.VR_CUSTOMERS VR_CUSTOMERS 
    WHERE (
    LENGTH(NAME)>4 AND 
    (UPPER(NAME) NOT LIKE UPPER('%delete%')) AND 
    (COMPANY_NAME IS NOT NULL OR (COMPANY_NAME IS NULL AND FIRST_NAME IS NOT NULL AND LAST_NAME IS NOT NULL AND FIRST_NAME LIKE '%^[A-z]+$%' AND LAST_NAME LIKE '%^[A-z]+$%')) 
    ) 
    

    :ここ

    FIRST_NAME | LAST_NAME | COMPANY_NAME |   Good customer? 
    -----------|-----------|--------------|-------------------------------- 
        Alex | Goodman | AG Inc. | Yes - All are filled out 
        John | Awesome |    | Yes - First and last are fine 
        Cindy |   | Cindy Corp. | Yes - Company is filled out 
          |   | Blank Spa | Yes - Company is filled out 
          |   |    | No - Nothing is filled out 
        Gordon | Mang#2 |    | No - Last contains non-alphabet 
        Jesse#5 | Levvitt | JL Inc. | Yes - Company is filled out 
        Holly |   |    | No - No last or company names 
    

    は、(削除SELECT句内のいくつかのフィールドを持つ)クエリがありますまた、正規表現'%[^a-z]%'を試しました。私はLIKEの代わりにRLIKEREGEXPを試しましたが、どちらもうまくいきませんでした。

    上記のクエリでは、結果にはCOMPANY_NAMEのレコードのみが表示されます。

  • +0

    あなたは、この目的のためにカスタム関数を作成することができます。ここでは

    は、この修正後のWHERE句です。 http://stackoverflow.com/a/10395393/6348498 – GurV

    答えて

    1

    REGEXP_LIKEと正規表現^[A-z]+$を使用して問題を解決しました。

    WHERE (
    LENGTH(NAME)>4 AND 
    (UPPER(NAME) NOT LIKE UPPER('%delete%')) AND 
    (COMPANY_NAME IS NOT NULL OR (COMPANY_NAME IS NULL AND REGEXP_LIKE(FIRST_NAME, '^[A-z]+$') AND REGEXP_LIKE(LAST_NAME, '^[A-z]+$'))) 
    ) 
    
    0

    あなたはRLIKEとREGEXPの言及を与えてMySQLを使用しているようです。句は、それがregular expression character class 'alpha'使用WHEREその場合には、これを試してください:NOT NULLチェックが冗長な正規表現を与えていることを念頭に置いて

    WHERE 
         COMPANY_NAME is not null -- COMPANY_NAME being present is the higher priority pass condition 
        or (-- but if COMPANY_NAME is not present, then the following conditions must be satisfied 
          FIRST_NAME is not null 
         and FIRST_NAME REGEXP '[[:alpha:]]+' 
         and LAST_NAME is not null 
         and LAST_NAME REGEXP '[[:alpha:]]+' 
        ) 
    

    ベアを、ので、WHERE句は、に自分自身を簡素化します:

    WHERE 
         COMPANY_NAME is not null -- COMPANY_NAME being present is the higher priority pass condition 
        or (-- but if COMPANY_NAME is not present, then the following conditions must be satisfied 
          FIRST_NAME REGEXP '[[:alpha:]]+' 
         and LAST_NAME REGEXP '[[:alpha:]]+' 
        ) 
    
    +0

    私はそれがMySQLだとは思わないが、私は実際にそれが何を使用しているのか分からない。 REGEXPを使用すると、実際には「無効な関係演算子」エラーが発生します。 – WolfieeifloW

    +1

    Alphaが動作していないため、REGEXPが機能しませんでした。 'COMPANY_NAMEはNULLではありません(COMPANY_NAMEはNULLであり、REGEXP_LIKE(FIRST_NAME、 '^ [Az] + $')とREGEXP_LIKE(LAST_NAME、 '^ [Az] + $')))と一緒に使えるようになりました。 ' – WolfieeifloW

    +1

    最終的にはうまくいっていると聞いてよかったです。そして、REGEXP_LIKEは明らかにOracleの状態なので、基になるデータベースの謎も明らかにするでしょう! – Phylyp

    関連する問題