2014-05-19 4 views
-1

나는이 열이 SQL/ORACLE/INFORMIX이 테이블이 :이 경우 특정 레코드를 삭제하는 가장 좋은 방법은 무엇입니까?

(1,2,3,7,12) 

내가 Lot 테이블에서 레코드를 제거해야합니다

Table: Lot 
Columns: Id, Status and ProcessList 

그래서, 내 열 PROCESSLIST이 같은 VARCHAR를 저장 이 pseudoexample 같은 고유의 프로세스에 의해 :

Delete from Lot where ProcessList contains process 7 

내가 어떻게 할 수 있니?

+7

지금까지 가장 좋은 방법은 데이터베이스 스키마를 변경하는 것입니다. 쉼표로 구분 된 목록으로 데이터를 저장하는 것은 RDBMS에서 수행 할 수있는 최악의 작업 중 하나입니다. Java 객체를 BLOB로 덤프하거나 "일반적인"키 - 값 접근 방식을 사용하거나 XML으로 모든 것을 저장하는 것만 큼이 작업을 완료해야합니다. –

+1

그래서 이것은 동시에'SQL SERVER'와'ORACLE' * (그리고'INFORMIX'도) *입니다. 그리고 하나의 필드에 여러 개의 사실을 저장하는 것이 포함됩니까? 무서운. – MatBailie

+1

우선 최악의 DB 디자인으로 테이블을 표준화 해보십시오. 너의 테이블은 1NF에도조차 없다. – Rahul

답변

1

delete from Lot where 
    ProcessList like '(7,%' or 
    ProcessList like '%,7)' or 
    ProcessList like '%,7,%' or 
    ProcessList = '(7)'; 

쿼리가 process_id 및 쉼표 기호 및 process_id와 닫는 중괄호 사이에 공백 사이에 공백이없는 가정 해보십시오. 그리고 그 ProcessList 텍스트 필드입니다 :)

당신도 알다시피, 쿼리는 매우 가능한 모든 경우 추가로 읽기 쉽게되지 않습니다. 그런 문자열을 사용하기가 어려우므로 이 실제로이기 때문에 주석 값과 같이 값을 저장하는 것을 재검토하고 싶습니다. 당신이 절대적으로 스키마를 (바람직하다)를 변경할 수없는 경우

+0

@LucasAbilidebob 네 말이 맞아. 해당 문제를 해결하기 위해 쿼리를 업데이트했습니다. 동일한 가정 - 아무 것도없는 공백. –

+0

해답을 주셔서 감사합니다. 그러나 (7)의 경우는 작동하지 않습니다. –

+0

@LucasAbilidebob 역시 수정되었습니다. –

2

이 작동합니다 :

DELETE FROM Lot 
WHERE ProcessList LIKE '%,7,%' -- number is in middle of list 
OR ProcessList LIKE '%,7)' -- number is at the end of a list 
OR ProcessList LIKE '(7,%' -- number is at the start of the list 
OR ProcessList LIKE '(7)' -- number is the only item in the list 
+2

'LIKE'%, 7, % ''그렇지 않으면 7, 17, 27 등 ... –

+0

@DanielE와 일치합니다. 예, 조정 해 봤습니다. – DavidG

관련 문제