SQL 사용자 정의 및 평가/구문 분석(및 \!\!\!...)안녕!
JMP 쿼리 빌더를 사용할 수 없고 SQL Custom으로 작성해야 하는 쿼리를 많이 수행합니다.
하지만 내 코드를 일반화하고 싶기 때문에 많은 평가/삽입 및 \!를 통합해야 합니다.
예는 다음과 같습니다.
아직 일반화되지 않은 코드
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT \!"t1\!".lot_id
FROM \!"public\!".\!"v_test_run\!" \!"t1\!"
WHERE ( ( ( \!"t1\!".test_run_timestamp >= '2020-11-01 15:25:11' ) ) ) ;"
)
) << Modify;
날짜를 포함하도록 일반화된 코드:
gbStr = Eval Insert("
New SQL Query(
Connection(
\!"ODBC:blabla\!"
),
QueryName( \!"v_test_run\!" ),
CustomSQL(
\!"SELECT \!\!\!"t1\!\!\!".lot_id
FROM \!\!\!"public\!\!\!".\!\!\!"v_test_run\!\!\!" \!\!\!"t1\!\!\!"
WHERE ( ( ( \!\!\!"t1\!\!\!".test_run_timestamp >= '^date_deb^' ) ) ) ;\!"
)
) << Modify;
");
Eval( Parse( gbStr ) );Is there any other method that would save me from having to juggle with these \!\!\! symbols?
복잡한 스크립트에서는 처리하고 디버깅하기가 정말 어렵습니다!
감사합니다
데이터 접근Re: SQL Custom and Eval / Parse (and \!\!\!...)좋습니다. 정말 유용합니다! 그리고 방금 데이터베이스를 만들었고 내가 이 작업의 주역이었기 때문에 테이블 이름이나 변수 이름에 괄호나 공백이 없는지 확인했으므로 이 일반화를 단순화해야 합니다.
Re: SQL Custom and Eval / Parse (and \!\!\!...)나는 직관적이지 않은 eval 구문 분석 조합을 피하는 다른 경로를 따르는 것을 좋아합니다. 여기서 그것들은 다른 목적에 매우 유용합니다.
종종 복잡한 쿼리가 있습니다(SQL 개발자와 같은 다른 도구에서 일반 SQL로 작성). 그리고 몇 가지 변수를 수정해야 합니다.
첨부된 예제는 큰 클래스 데이터 테이블에서 작동하는 방식을 보여 주지만 모든 ODBC 연결에서 유사한 방식으로 작동합니다.
간단히 "New SQL Query".object에 제공된 문자열 변수의 연결 문자열(여기서는 사용되지 않음)과 SQL 쿼리를 준비합니다.
큰 쿼리와 코드 폴딩에 적합하기 때문에 "="대신 "assign"을 사용합니다.
그리고 개방형 데이터베이스 기능을 사용하거나 다른 방식으로 SQL을 처리하는 데 더 유연합니다.
"Big Class"와 같이 이름에 공백 등이 있는 경우가 아니면 일반 SQL에서는 큰따옴표가 필요하지 않습니다.
Names Default To Here( 1 );
cdt = Open( "$Sample_Data\Big Class.jmp" );
age = "15";
// define custom SQL with placeholder
Assign( sql_str, "SELECT t1.name, t1.age, t1.sex, t1.height,
t1.weight
FROM \!"Big Class\!" t1
WHERE ( ( ( t1.age IN ( &age ) ) ) ) ;" );
// fill placeholder
Substitute Into( sql_str, "&age", "15" );
// execute query
dt_age = New SQL Query( Version( 130 ), Connection( "JMP" ), JMP Tables( cdt ), QueryName( "aged" || "_" || age ), CustomSQL( sql_str ) ) << Run;
Re: SQL Custom and Eval / Parse (and \!\!\!...)나는 이 구문이 당신이 그것을 이해한 후에야 명백하고 심지어 혼란스럽다는 데 동의합니다.체크아웃 이 위시리스트 항목 Eval Expr First() 함수를 도입하는 것이 더 직관적일까요?
Re: SQL Custom and Eval / Parse (and \!\!\!...)구분 기호 \[ 및 ]\를 사용하여 문자열에 큰따옴표를 포함합니다.
date_deb = "to_date('01-Mar-2019', 'dd-mon-yyyy')";
gbStr = Eval Insert("\[
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ^date_deb^ ) ) ) ;"
)
) << Modify;
]\");
write(gbstr);
Eval( Parse( gbStr ) );
산출:
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= to_date('01-Mar-2019', 'dd-mon-yyyy') ) ) ) ;"
)
) << Modify;Re: SQL Custom and Eval / Parse (and \!\!\!...)매우 감사합니다! 이 기사를 읽고 시도했지만 여전히 이 eval을 마스터하는 데 어려움이 있습니다(eval expr(expr))
Re: SQL Custom and Eval / Parse (and \!\!\!...)에 설명된 몇 가지 옵션이 있습니다. 이 기사 , Eval( Eval Expr())로 시작한 다음 Expr()로 교체해야 하는 각 부분을 래핑하고 \[ ... ]\를 사용하여 이스케이프 문자 수를 줄이는 것이 좋습니다.다음과 같이 보일 수 있습니다.
Eval( Eval Expr(
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
Expr( "\[SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ']\" || date_deb || "' ) ) ) ;")
)
) << Modify
) );
답변: SQL Custom 및 Eval/Parse(그리고 \!\!\!...)@pmroz 위와 비슷한 것을 시도했습니다. 사용자 지정 SQL 실행 후 반환되는 결과는 로그 끝에 1입니다. 1의 결과에 대해 더 자세히 설명해 주시겠습니까? 스크립트에서 언급한 Eval( Parse( gbStr ) ) 반환 코드입니까?

답변: SQL Custom 및 Eval/Parse(그리고 \!\!\!...)죄송합니다. 저는 쿼리 빌더를 사용하지 않습니다. 나는 반환 값 1이 성공을 나타내는 true라고 추측합니다. 하지만 그건 터무니없는 추측일 수도 있다:)
답변: SQL Custom 및 Eval/Parse(그리고 \!\!\!...)@pmroz 답장을 보내주셔서 감사합니다. 다음 스크립트를 검토하는 데 도움을 주시겠습니까?
SQL 쿼리는 일반적으로 데이터베이스에 액세스하는 데 몇 분이 걸립니다. 행 삭제(:rank >1인 경우)는 때때로 실행되지 않지만 수동으로 수행할 수 있습니다. 모르겠어요.... 내 스크립트에 문제가 있는지 확실하지 않나요?
date_deb = "to_date('01-Mar-2019', 'dd-mon-yyyy')";
gbStr = Eval Insert("\[
dt1 = New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ^date_deb^ ) ) ) ;"
)
) << Run foreground;
]\");
write(gbstr);
Eval( Parse( gbStr ) );
dt1 << New Column( "Rank", Numeric, "Continuous", Format( "Best", 12 ) );
dt1:Rank << set Formula( Col Rank( :DATE* -1, :ID ) );
dt1 << Row Selection(select where(:Rank > 1 ));
dt1 << delete rows;
답변: SQL Custom 및 Eval/Parse(그리고 \!\!\!...)수식 평가에는 시간이 좀 걸릴 것 같은데,
wait(0)을 사용하면 행 선택이 완료되고(스크립트 참조) 삭제가 완료될 때까지 JMP가 강제로 종료됩니다.
문자열 부분은 항상 오류가 발생하기 쉽고 읽기 어렵기 때문에 가능한 한 작게 유지하는 것이 좋습니다.
또한 JMP 테이블을 사용하여 이러한 종류의 문제를 파악하고 모든 사람이 즉시 사용할 수 있는 커뮤니티용 스크립트를 작성하는 것도 매우 유용합니다.
Edited: replaced "\C:\Program Files\JMP\JMPPRO\18\Samples\Data" by "$SAMPLE_DATA"
Names Default To Here( 1 );
// date_deb = "to_date('01-Mar-2019', 'dd-mon-yyyy')";
date_str = "2008-06-19";
/*
gbStr = Eval Insert("\[
dt1 = New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ^date_deb^ ) ) ) ;"
)
) << Run foreground;
]\");
*/
dt1_sql = Eval Insert(
"\[SELECT t1.Date, t1.State, t1."Flu Cases", t1.Region,
t1."Population (July 2009)"
FROM "Seasonal Flu" t1
WHERE ( ( ( t1.Date >= JMPDATE('^date_str^') ) ) ) ;]\"
);
dt1 = New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( ["Seasonal Flu" => "$SAMPLE_DATA\Seasonal Flu.jmp"] ),
QueryName( "SQLQuery1" ),
CustomSQL( dt1_sql )
) << run;
// Write( gbstr );
// Eval( Parse( gbStr ) );
dt1 << New Column( "Rank", Numeric, "Continuous", Format( "Best", 12 ) );
dt1:Rank << set Formula( Col Rank( :DATE * -1, /* :ID */ :State) );
wait(0);
dt1 << Row Selection( select where( :Rank > 1 ) );
dt1 << delete rows;
답변: SQL Custom 및 Eval/Parse(그리고 \!\!\!...)@Georg 제안에 감사드립니다. 끈 부분을 가능한 한 작게 유지하는 것은 정말 훌륭하고 현명한 아이디어입니다. 시도해 보았지만 여전히 wait(0)으로 인해 삭제가 실패합니다. 하지만 wait(1)에서는 작동합니다. 그러나 SQL 데이터 센터에서 더 많은 크기의 데이터에 액세스하면(서버에서 데이터를 가져오는 데 몇 분이 걸릴 수 있음) wait(5)까지 작동합니다. 내 생각에는 col Rank()는 일반적으로 계산하는 데 시간이 좀 걸립니다. 더 많은 데이터 크기, 더 많은 계산 시간. 열 순위 계산이 끝나기 전에 행 선택을 실행하면 삭제가 실패합니다. 계산이 완료되었는지 확인할 수 있는 방법이 있나요? 그렇다면 IF 함수를 사용하여 다음 단계를 실행할 수 있습니다.
답변: SQL Custom 및 Eval/Parse(그리고 \!\!\!...)@ReliabilityWolf 일반적으로 데이터베이스에서 필터링을 시도하므로 수행 방법이 있는 SQL 언어에 따라 다릅니다(SQL에서도 하위 선택과 함께 순위를 사용할 수 있습니다). 그리고 불필요한 트래픽 때문에 많은 시간을 벌게 됩니다.
또한 이에 대한 수식을 사용하지 않을 것입니다. ID에 고유한 값을 갖고 싶다면 SQL에서 정렬하고 중복 행 선택 및 삭제를 사용할 수 있습니다. 아래를 참조하세요. 데이터베이스는 일반적으로 클라이언트보다 이러한 작업을 훨씬 빠르게 수행합니다.
수식과 관련하여 필요한 경우 "수식 실행" 또는 "수식 재실행"이라는 표 메시지가 도움이 될 수 있습니다. 또는 수식을 삭제하거나 결과를 열에 직접 쓸 수도 있습니다.
Names Default To Here( 1 );
date_str = "2008-06-19";
dt1_sql = Eval Insert(
"\[SELECT t1.Date, t1.State, t1."Flu Cases", t1.Region,
t1."Population (July 2009)"
FROM "Seasonal Flu" t1
WHERE ( ( ( t1.Date >= JMPDATE('^date_str^') ) ) )
order by
t1.State, t1.date desc;]\"
);
dt1 = New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( ["Seasonal Flu" => "$SAMPLE_DATA\Seasonal Flu.jmp"] ),
QueryName( "SQLQuery1" ),
CustomSQL( dt1_sql )
) << run;
dt1 << Select Duplicate Rows( Match( :State ) ) << delete rows();
답변: SQL Custom 및 Eval/Parse(그리고 \!\!\!...)데이터베이스 필터링에 대한 귀하의 새로운 방향에 진심으로 감사드립니다. 이것 좀 보도록 할게요. 다시 한 번 감사드립니다.