1

購入した製品の商品説明を含む MySQL データベースのフィールドがあります。これらのいくつかは平易な英語の説明であり、他のものは部品番号であり、他のものは依然として部品番号の後に説明が続きます. replace() を使用して、文字列からすべてのスペースとダッシュを削除しました。

データは次のようになります。

1938420985390asdfih
1234812934810dflkasd
asdfasldkjfaasdfjasd
asd;flkjaklsdf
adfsdf1234073927357sdapjfas
1/4sdikhsd 

そして私は戻りたい:

1938420985390
1234812934810
(null)
(null)
1234073927357
(null)

私が本当に必要としているのは、余分な文字/文字ではなく、13 桁の部品番号を返す SQL を作成することです。一致/不一致の 1 または 0 ではなく、実際の数値も返すことをお勧めします。

REGEXP 関数を使用してみました (誰かがregexp ('\d{13}')orを提案しregexp ('\p{13}')ましたが、これらは機能しませんでした [これらは、一致した文字列の一部ではなく、0 または 1 を返しました]。何か提案はありますか?

ありがとう!

4

5 に答える 5

1

これは MySQL では重要なタスクです。正規表現の一致を返す組み込み関数はありません。しかし、正確に 13 桁を探しているので、次のようなことができます (明らかに、これをチェックする必要がある位置の数に拡張します...

-- setup test
CREATE TABLE t (foo VARCHAR(30));
INSERT INTO t VALUES 
('1938420985390asdfih')
,('1234812934810dflkasd')
,('asdfasldkjfaasdfjasd')
,('asd;flkjaklsdf')
,('adfsdf1234073927357sdapjfas')
,('1/4sdikhsd')


SELECT CASE
       WHEN SUBSTR(foo,1,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,1,13)
       WHEN SUBSTR(foo,2,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,2,13)
       WHEN SUBSTR(foo,3,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,3,13)
       WHEN SUBSTR(foo,4,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,4,13)
       WHEN SUBSTR(foo,5,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,5,13)
       WHEN SUBSTR(foo,6,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,6,13)
       WHEN SUBSTR(foo,7,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,7,13)
       WHEN SUBSTR(foo,8,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,8,13)
       WHEN SUBSTR(foo,9,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,9,13)
       END AS digits
  FROM t

-------------------
1938420985390
1234812934810
(NULL)
(NULL)
1234073927357
(NULL) 

いいえ、きれいではありません。ただし、これを拡張して、妥当な長さの文字列を効果的に「スキャン」できるはずです。

注: 正規表現は、13 文字の部分文字列全体が正確に 13 文字で構成されていることを確認しています。各文字は 10 進数 (0 から 9) です。

于 2012-08-23T14:58:20.223 に答える
0

ここで説明されているように、一致した値を取り戻すことは、MySQL ではまだサポートされていない可能性があります - MySQL 正規表現と REGEXP 演算子。ただし、リンクに記載されているように、次のように使用できるサードパーティのライブラリがあります: UDF Repository for MySQL。これにより、 を使用して一致をキャプチャできますPREG_CAPTURE

詳細については、このStackOverflow リンクがこの問題に対処しているようです。

于 2012-08-23T14:52:15.303 に答える
-1

代わりに、Linuxのコマンドでmysql簡単に実行できますgrep

grep [0-9] foo.txt

次に、テーブルを作成してmysqlにロードします。

于 2016-06-15T17:12:59.460 に答える