2017-12-08 9 views
0

SQL 쿼리가 있습니다. 너무 많은 BO가 관련되어 있기 때문에 1000 개가 넘는 열이 포함 된 매우 큰 쿼리가 생성됩니다. 그래서 난 손에 전에 열 개수를 찾을 수있는 몇 가지 방법을 필요로하고 1000 열 오류를 처리하는 몇 가지 논리를 적용합니다.쿼리를 실행하기 전에 SQL에서 열 수를 얻는 방법? 즉 ResultSetMetaData 이외의 방법

열 개수를 얻기 위해 쿼리를 구문 분석하면 도움이 될 수 있습니다. 그러나 그것을 구현하는 방법을 알지 못한다.

참고 : 이미 아래 코드를 시도했지만 결과가 나옵니다. 그러나 쿼리를 실행하고 싶지 않습니다. 비용이 많이 듭니다.

PreparedStatement pstmt; 
    try { 
     pstmt = getConnection().prepareStatement(sql); 
     ResultSetMetaData meta = pstmt.getMetaData(); 
     System.out.println(meta.getColumnCount()); 

    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

'LIMIT'을 사용해 보셨습니까? – ThomasEdwin

+0

'LIMIT'은 열이 아닌 행입니다. @ThomasEdwin – user3662708

+0

ThomasEdwin의 생각은'where rownum = 0'은 아무런 값이 들지 않는다는 것입니다. 왜냐하면 당신이 0 행을 검색하기 때문에 (DBMS가 즉시 감지합니다), 당신은 단순한 열 정보 만 얻습니다. –

답변

0

SELECT 문 다음에 와일드 카드를 많이 사용하는 SQL 쿼리가 맞습니까? 와일드 카드를 사용하지 않으면 SELECT와 FROM 사이에서 SQL 쿼리 부분을 구문 분석하여 열 번호를 얻을 수 있습니다. 알 수없는 특성을 가진 큰 결과가 나온다면 강제로 약간의 교란을 느낍니다. SQL 테이블이 데이터 소스라고 말할 수 있다면 쿼리 결과도 데이터 소스라고 말할 수 있습니다. SQL 테이블의 경우 우리는 그것이 포함하는 컬럼 (속성)을 매우 구체적으로 정의했습니다. 열을 지정하지 않고 SQL 쿼리를 만들면 알 수없는 엔터티의 데이터 소스가 있습니다. 일부 BI 시스템을 만들려고하십니까? 그렇다면 테이블의 메타 데이터를 가져와이 정보를 기반으로 특정 쿼리를 만드는 것을 고려해야합니다.

+0

쿼리가 다른 테이블과 열의 데이터를 가져 와서 UI에 표시하므로 많은 열이 쿼리를 통해 페치되도록 바인딩됩니다. 또한 더 많은 열을 가져 오는 책임이있는 일부 열 값에 대한 하이퍼 링크가 있으므로 피할 수 없습니다. 생각이 있다면, select와 from 사이에서 어떻게 쿼리 부분을 파싱 할 수 있습니까? – Shitalb1

+0

나는 여전히 SQL 쿼리를 어떤 방식으로 만들 수 있다면 (UI를 통한 사용자 선택 또는 간단한 쓰기를 기반으로하는 일부 일반) 사용자가 필요한 모든 것을 얻을 수있는 방법이 있다고 생각합니다. 내 견해가 좋은 parctises (사용자가 SQL 쿼리를 작성하게하지 마십시오 등)을 기반으로하는 소스. 내가 생각하는 사실에도 불구하고 열을 파싱하는 간단한 방법은 매우 까다 롭습니다. String [] column = sql.substring (sql.indexOf ("SELECT") + 6, sql.indexOf ("FROM ")). split (", ") – Majlanky

2

이 같은 평범한 구식 선택 쿼리 인 경우 :

select col1,col2 as xyz, col3,col4... from ... where ...

는이 같은 것을 할 수있다 : 조회가 fn(col,'blah blah')과 같은 기능이 포함되어있는 경우

String select="select";//"SELECT" if yours is in caps 
String from="from";//"FROM" if yours is in caps 
String cols = sql.substring(sql.indexOf(select)+select.length(), sql.indexOf(from)); 
int colCount = cols.split(",").length; 

을 일부 추가를 작성해야 그러한 기능을 식별하고 적절하게 처리하는 코드.

+0

예, 이전 게시물의 주석에 설명 된 해결책이지만 프로그래머가 쿼리 생성 (concating) 알고리즘을 알고 있으면 작성 중에 열을 계산하고 일부를 쿼리에 연결하지 않아야한다고 생각합니다. 코드를 작성한 다음 나중에 구문 분석합니다. – Majlanky