2011-08-24 2 views
1

"이름"이라는 열이있는 "locales"테이블이 있습니다. 이름의 레코드는 항상 밑줄 (예 : "foo_", "bar _"...)로 묶인 문자로 시작합니다. 레코드에는 밑줄이 하나 이상있을 수 있으며 밑줄이 반복되기 전에 패턴이 반복 될 수 있습니다 (예 : "foo_bar_", "foo_foo_").MySQL : 레코드의 일부를 제거하는 REGEXP

간단한 쿼리를 사용하면 첫 번째 밑줄을 포함하여 첫 번째 밑줄 앞에있는 모든 것을 제거 할 수 있습니까? PHP에서이 작업을 수행하는 방법을 알고 있지만 MySQL에서 수행하는 방법을 이해할 수 없습니다.

답변

4

SELECT LOCATE('_', 'foo_bar_') ...은 첫 번째 밑줄의 위치를 ​​제공하며 SUBSTR('foo_bar_', LOCATE('_', 'foo_bar_'))은 첫 번째 밑줄부터 시작하여 부분 문자열을 제공합니다. 그걸 없애고 싶다면, locate-value 값을 하나씩 늘리십시오.

이제 테이블 자체의 값을 바꾸려면 UPDATE table SET column = SUBSTR(column, LOCATE('_', column))과 같은 업데이트 명령문을 사용하면됩니다.

+1

브릴 런트는 완벽하게 작동했습니다. 감사! –

-1

MySQL REGEX는 데이터와 일치 할 수 있지만 대체 할 수 없습니다. PHP 스크립트에서 클라이언트 쪽을 바꾸거나 MySQL에서 표준 문자열 연산을 사용하여 변경 작업을 수행해야합니다.

UPDATE sometable SET somefield=RIGHT(LENGTH(somefield) - LOCATE('_', somefield)); 

아마도 거기에는 다소 벗어난 오류가있을 수 있습니다.하지만 그 기본 방법은 문제가 될 것입니다.

0
select substring('foo_bar_text' from locate('_','foo_bar_text')) 
관련 문제