sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLで文字列内の正規表現の一致の位置を取得するにはどうすればよいですか?

    これを行う1つの方法(多くの方法):一致で始まる残りの文字列を削除し、切り捨てられた文字列の長さを測定します:

    SELECT id, title
    FROM   book
    WHERE  title ILIKE '%deep%space%'
    ORDER  BY length(regexp_replace(title, 'deep.*space.*', '','i'));
    

    ILIKEの使用 WHERE句では、通常は高速であるため(ここでも同じことを行います)、
    regexp_replace()の4番目のパラメーターにも注意してください。 関数('i' )、大文字と小文字を区別しないようにします。

    代替案

    コメントのリクエストに従って。
    同時に、一致を並べ替える方法を示します 最初(および NULLS LAST

    SELECT id, title
          ,substring(title FROM '(?i)(^.*)deep.*space.*') AS sub1
          ,length(substring(title FROM '(?i)(^.*)deep.*space.*')) AS pos1
    
          ,substring(title FROM '(?i)^.*(?=deep.*space.*)') AS sub2
          ,length(substring(title FROM '(?i)^.*(?=deep.*space.*)')) AS pos2
    
          ,substring(title FROM '(?i)^.*(deep.*space.*)') AS sub3
          ,position((substring(title FROM '(?i)^.*(deep.*space.*)')) IN title) AS p3
    
          ,regexp_replace(title, 'deep.*space.*', '','i') AS reg4
          ,length(regexp_replace(title, 'deep.*space.*', '','i')) AS pos4
    FROM   book
    ORDER  BY title ILIKE '%deep%space%' DESC NULLS LAST
             ,length(regexp_replace(title, 'deep.*space.*', '','i'));
    

    上記のすべてのドキュメントは、マニュアルこちら およびこちら

    -> SQLfiddle すべてを示しています。



    1. MySQLは他のDBMSと比較して大幅に多くのリソースを消費しますか?

    2. Java 6用のどのOJDBCドライバー?

    3. 191行目のエラー:ORA-01489:文字列連結の結果が長すぎます

    4. BETWEEN句と<=AND>=