SQLクエリ-左1 =文字、右3〜5 =名前の数字
-
07-07-2019 - |
質問
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]"のみです大文字と小文字の区別がない場合