質問

SQL(SQL Server 2008)テーブルのジャンクデータを除外する必要があります。これらの記録を特定し、引き出す必要があります。

  • Char [0] = A..Z、a..z
  • Char [1] = 0..9
  • Char [2] = 0..9
  • Char [3] = 0..9
  • Char [4] = 0..9

{空白は不可}

基本的に、クリーンなレコードは次のようになります。

  • T1234、U2468、K123、P50054(4つの記録例)

ジャンクデータは次のようになります。

  • T12 ..、。T12、MARK、TP1、SP2、BFGL、BFPL(7件のレコード例)

誰かがSQLクエリを支援してLEFTおよびRIGHTメソッドを実行し、それらの文字を抽出し、LIKE INまたは何かを実行できますか?

機能は素晴らしいでしょう!

役に立ちましたか?

解決

以下はいくつかの異なるシステムで動作するはずです:

SELECT * 
FROM TheTable
WHERE Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]%'
AND Data NOT LIKE '% %'

このアプローチは、P2343、P23423JUNK、およびその他の類似のテキストと実際に一致しますが、形式がA0000 *である必要があります。

今、OPが1番目の位置の形式が文字であり、後続のすべての位置がA0 +のように数値である場合、次を使用します(SQL Serverおよび他の多くのデータベースシステムで):

SELECT *
FROM TheTable
WHERE SUBSTRING(Data, 1, 1) LIKE '[A-Za-z]'
AND SUBSTRING(Data, 2, LEN(Data) - 1) NOT LIKE '%[^0-9]%'
AND LEN(Data) >= 5

これをSQL Server 2008の機能に組み込むには、これが最も望ましいと思われるため、次のように記述できます。

CREATE FUNCTION ufn_IsProperFormat(@data VARCHAR(50))
RETURNS BIT
AS
BEGIN
    RETURN 
     CASE 
      WHEN SUBSTRING(@Data, 1, 1) LIKE '[A-Za-z]'
        AND SUBSTRING(@Data, 2, LEN(@Data) - 1) NOT LIKE '%[^0-9]%'
        AND LEN(@Data) >= 5 THEN 1 
       ELSE 0 
      END
END

...そして次のように呼び出します:

SELECT * 
FROM TheTable
WHERE dbo.ufn_IsProperFormat(Data) = 1

... OracleはLIKE句でブラケット表記をサポートしていないように見えるため、このクエリはOracleクエリに対して変更する必要があります。

SELECT *
FROM TheTable
WHERE REGEXP_LIKE(Data, '^[A-za-z]\d{4,}

これはgbnが彼の答えで行っている拡張ですが、これらのバージョンではOR条件なしで文字列の長さを変えることができます。

編集:A1324、A2342388、およびP2342は一致するが、A2342JUNKとA234は一致しないように、フォーマットA0 +を確保するためにSQL ServerおよびOracleの例をサポートするように更新されました。

Oracle REGEXP_LIKEコードはMarkの投稿から借用しましたが、4桁以上の数字をサポートするように更新されました。

これらの手法を実装するカスタムSQL Server 2008アプローチを追加しました。

)

これはgbnが彼の答えで行っている拡張ですが、これらのバージョンではOR条件なしで文字列の長さを変えることができます。

編集:A1324、A2342388、およびP2342は一致するが、A2342JUNKとA234は一致しないように、フォーマットA0 +を確保するためにSQL ServerおよびOracleの例をサポートするように更新されました。

Oracle REGEXP_LIKEコードはMarkの投稿から借用しましたが、4桁以上の数字をサポートするように更新されました。

これらの手法を実装するカスタムSQL Server 2008アプローチを追加しました。

他のヒント

データベースに依存します。多くには正規表現関数があります(例はテストされていないので確認してください)

e.g。オラクル

SELECT x
 FROM table
 WHERE REGEXP_LIKE(x, '^[A-za-z][:digit:]{4}

SybaseはLIKEを使用します

)

SybaseはLIKEを使用します

例では3〜6桁の数字を許可していることを考えると、2番目の文字以降でISNUMERIC()関数を使用することをお勧めします。

SELECT *
FROM TheTable
-- start with a letter
WHERE Data LIKE '[A-Za-z]%'
    -- everything from 2nd character onwards is a number
    AND ISNUMERIC( SUBSTRING( Data, 2, 50 ) ) = 1
    -- number doesn't have a decimal place
    AND Data NOT LIKE '%.%'

詳細については、MSDNの ISNUMERIC 関数をご覧ください。

次の点にも注意してください:

  • 2番目の部分の数を最大50文字に制限しました。必要に応じてこれを変更してください。
  • 厳密に言えば、通貨記号などをチェックする必要があります。ISNUMERICで許可されているため、+ /-およびその他のいくつかの

より良いオプションは、最初の文字の後の各文字が0から9(またはASCIIコードを使用している場合は1から0)であることをチェックする関数を作成することです。

SQL Serverでは正規表現を使用できないため、ORを使用する必要があります。デビッド・アンドレスの答えを修正しています...

WHERE
    (
    Data LIKE '[A-Za-z][0-9][0-9][0-9]'
    OR
    Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]'
    OR
    Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9][0-9]'
    )

Davidの回答では、「D1234junk」が許可されています。通して

必要なのは" [A-Z]"のみです大文字と小文字の区別がない場合

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top