2016-04-22 7 views
2

私はカラムがpartnumberのテーブル 'products'を持っています。私は特別な文字を無視して検索します

検索中にレコードから特殊文字を無視したいです。私は部品番号で5つのレコードの次き

たとします。私は「XP1」を検索しようとすると、今

XP-12345 
MV-334-3454 
XP1-5555 
VX-AP-XP-1000 
VT1232223 

は、出力は次のレコードのように来るべきである

XP-12345 
XP1-5555 
VX-AP-XP-1000 

mysqlの書き方これについて質問しますか?

答えて

0

REGEXPを使用して検索を許可する必要があります。 EX:

SELECT partnumber 
    FROM partnumber_tbl 
WHERE name REGEXP '[XP1]\-'; 

これは、それがX、P、1を含む何かを見つけるためにデータベースを検索できるようになります。

Hereが実際の例です。 regexpあなたの詳細を見るための情報。 Official docs、私はそれら、特にoraclesを読んで嫌い。

.......

+0

結果プロパティは表示されません。それは、XP1が設立された場合の結果のみを表示します。 XPと1の間に特殊文字があれば無視して結果を表示する必要があります。特殊文字のみ無視する必要がありますが、それぞれの文字を別々の検索タームとして分割する必要はありません。 "XP"を結合する必要があります – user3264863

+0

文字のエスケープ時に引用符で囲まれている限り、リンク先は更新されました – Jorden

+0

私はそれに ' - '記号が含まれていることを知っていますが、クエリで@、_、および\ characterを無視しなければならないとしたらどうすればいいですか? – user3264863

0

提供された文字列から記号を取り除くMySQL関数を定義します。その後

DELIMITER // 
CREATE FUNCTION STRIP_SYMBOLS(input VARCHAR(255)) 
RETURNS VARCHAR(255) DETERMINISTIC NO SQL 
BEGIN 
    DECLARE output VARCHAR(255) DEFAULT ''; 
    DECLARE c CHAR(1); 
    DECLARE i INT DEFAULT 1; 
    WHILE i < LENGTH(input) DO 
     SET c = SUBSTRING(input, i, 1); 
     IF c REGEXP '[a-zA-Z0-9]' THEN 
      SET output = CONCAT(output, c); 
     END IF; 
     SET i = i + 1; 
    END WHILE; 
    RETURN output; 
END// 
DELIMITER ; 

剥奪シンボルとpartnumberXP1を含んでいる場合、あなたのテーブルからレコードを選択します。

SELECT * FROM products WHERE STRIP_SYMBOLS(partnumber) LIKE '%XP1%'; 
-- Returns: XP-12345, XP1-5555, VX-AP-XP-1000 

あなたのテーブルが大きい場合、これは痛いほど遅くなることがあります。この場合、生成された列(MySQL 5.7.6以上を持っている場合)を調べるか、またはテーブルの列を更新してシンボルを削除したpartnumberで更新するトリガー(以前のバージョンの場合)を作成します。

0

concat()機能を使用してこの機能を実現することができます。私とあなたのJordenの回答のコメントを確認するには、-,_,@のような特別なcharecterを無視してXP1の文字列を検索したいというコメントをしてください。

だから、

SELECT partnumber FROM products 
    WHERE partnumber LIKE concat('%XP','_','1%') 
    OR partnumber LIKE '%XP1%';; 

(注)このクエリを使用することができます:あなたはSQLFIDDLE上で確認することができ、出力を必要とし、あなたの追加要件に基づいてクエリを調整することができます。

関連する問題