다중 값 변수에 대한 Grafana, SQL 및 IN() 목록
해결해야 할 문제: 다중 값 변수에서 SQL의 IN() 목록
이 예에서는 PostgreSQL database in Google Cloud SQL , 로드된 sample data from Gerald Venzl 및 free grafana cloud service 을 생성했습니다. 내 목표는 국가를 하나, 다수, 전부 또는 전혀 선택할 수 없는 것과 같은 것을 얻는 것입니다.
다음과 같이 국가 목록을 쿼리할 수 있습니다.
select country_id __value , name __text from countries order by 2
사용자에게 국가 이름을 표시하기 위해 "값"및 "텍스트"로 내 열의 별칭을 지정하지만 사용자가 선택한 항목에서 국가 코드를 가져옵니다.
그래서 이 쿼리를 사용하여 Grafana 변수를 만들고 사용자가 원하는 조합을 선택할 수 있도록 "다중 값"및 "모두 포함 옵션"을 선택했습니다.
이제 SQL 문에서 데모용으로 "mylist"라고 불렀던 이 변수를 사용해 보겠습니다.
select * from cities where country_id in ($mylist)
다양한 사용자 조합에 대해 생성된 검색어를 보여 드리겠습니다.
select * from cities where country_id in ('AND','ARE','AFG','ATG','ALB','ARM','AGO','ARG','AUT','AUS','AZE','BIH','BRB','BGD','BEL','BFA','BGR','BHR','BDI','BEN','BRN','BOL','BRA','BHS','BTN','BWA','BLR','BLZ','CAN','COD','CAF','COG','CHE','CIV','CHL','CMR','CHN','COL','CRI','CUB','CPV','CYP','CZE','DEU','DJI','DNK','DMA','DOM','DZA','ECU','EST','EGY','ERI','ESP','ETH','FIN','FJI','FSM','FRA','GAB','GBR','GRD','GEO','GHA','GMB','GIN','GNQ','GRC','GTM','GNB','GUY','HND','HRV','HTI','HUN','IDN','IRL','ISR','IND','IRQ','IRN','ISL','ITA','JAM','JOR','JPN','KEN','KGZ','KHM','KIR','COM','KNA','PRK','KOR','KWT','KAZ','LAO','LBN','LCA','LIE','LKA','LBR','LSO','LTU','LUX','LVA','LBY','MAR','MCO','MDA','MNE','MDG','MHL','MKD','MLI','MMR','MNG','MRT','MLT','MUS','MDV','MWI','MEX','MYS','MOZ','NAM','NER','NGA','NIC','NLD','NOR','NPL','NRU','NZL','OMN','PAN','PER','PNG','PHL','PAK','POL','PRT','PLW','PRY','QAT','ROU','SRB','RUS','RWA','SAU','SLB','SYC','SDN','SWE','SGP','SVN','SVK','SLE','SMR','SEN','SOM','SUR','SSD','STP','SLV','SYR','SWZ','TCD','TGO','THA','TJK','TLS','TKM','TUN','TON','TUR','TTO','TUV','TWN','TZA','UKR','UGA','USA','URY','UZB','VAT','VCT','VEN','VNM','VUT','WSM','XKX','YEM','ZAF','ZMB','ZWE')
이것은 사용자가 "모두"를 선택했을 때 내가 가지고 있는 것이며 정확합니다.
select * from cities where country_id in ('BEL','NLD','LUX')
이것은 사용자가 일부 국가를 선택할 때 내가 얻는 것이며, 이것은 다시 정확합니다.
select * from cities where country_id in ()
이것은 사용자가 아무것도 선택하지 않았을 때 얻는 것입니다. 그리고 Grafana 변수에는 이 가능성을 비활성화하는 옵션이 없습니다. 이것은 유효하지 않은 SQL 구문이며 PostgreSQL: pq: ")"근처에서 구문 오류가 발생하면 MySQL은 다음과 같이 표시합니다. SQL 구문에 오류가 있습니다. 1행의 ')' 근처에서 사용할 올바른 구문에 대해서는 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. Oracle은 다음을 표시합니다. ORA-00936: 누락된 표현식, SQL Server는 다음을 표시합니다. Grafana 다채로운 차트는 이와 같이 사용자에게 친숙하지 않은 메시지를 받을 때 덜 매력적입니다. 해결 방법이 필요합니다.
그다지 고급 형식이 아닙니다.
"고급"옵션이 가장 일반적인 데이터 쿼리 언어인 SQL에 대한 형식을 가져야 한다는 희망으로 "Advanced variable format options"을 확인했습니다. 하지만. CSV, OpenTSDB, Doublequote, Graphite, JSON, Elasticsearch, Percentencode, Pipe, Raw, Regex, Singlequote, Sqlstring, Text, URL 형식이 있지만 SQL에 대해서는 아무것도 없습니다! 예, SQL은 regexp에서 필터링할 수 있지만 인덱스 액세스, 동등성 또는 IN() 목록에서만 가능한 파티션 가지치기를 원합니다.
중첩 변수 및 SQL 변환
여기 내 해결 방법이 있습니다. 값 목록에서 IN() 목록을 빌드하기 위해 숨겨질 두 번째 변수를 만들었습니다. SQL 엔진이 있으므로 이를 사용하여 변환을 수행합니다.
select case when length($$${mylist:singlequote}$$)>0 then $$ in ($mylist:singlequote) $$ else ' is null ' end
여기에서는 SQL 쿼리의 기본값인 "작은따옴표"형식으로 이전 변수를 확장합니다. 그러나 CASE 문에 캡슐화합니다. 목록이 비어 있지 않으면 내 변수는 IN(...) 목록을 작성하지만 비어 있으면 사용자가 알 수 없는 값을 선택할 수 있도록 IS NULL로 대체하도록 선택합니다. 물론 항상 참 또는 거짓인 술어를 사용하여 동작을 결정할 수 있습니다.
그런 다음 내 대시보드 패널 쿼리는 다음과 같습니다.
select * from cities where country_id ${mylist_sql:raw}
사용자가 하나, 여러 개 또는 모든 값을 선택할 때 ${mylist}를 사용했을 때와 동일하게 확장됩니다.
그러나 사용자가 아무것도 선택하지 않은 경우:
select * from cities where country_id is null
오류가 없으며 내가 선택한 동작입니다. 최적화 프로그램은 기본 키가 null일 수 없음을 알고 있기 때문에 작업이 없는 행이 없습니다.
Reference
이 문제에 관하여(다중 값 변수에 대한 Grafana, SQL 및 IN() 목록), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/franckpachot/grafana-sql-and-in-list-for-multi-value-variable-9hb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)