Hive Query:定义一个变量,它是一个字符串列表

时间:2017-11-11 02:02:08

标签: sql hive hql

如何创建常量列表并在查询的WHERE子句中使用它?

例如,我有一个配置单元查询,我说

Select t1.Id,
       t1.symptom
from t1
WHERE lower(symptom) NOT IN ('coughing','sneezing','xyz', etc,...)

有没有一种方法可以提前定义它,而不是继续重复这长长的症状列表(这使得代码非常难看)

MyList =('咳嗽','打喷嚏','x',......)

然后在WHERE子句中我只是说在MyList中没有更低的(症状)。

3 个答案:

答案 0 :(得分:1)

您可以将列表放在表格中并使用join

Select t1.Id, t1.symptom
from t1
where lower(symptom) NOT IN (select symptom from mysymptoms_list);

这会保留列表,因此可以在多个查询中使用。

答案 1 :(得分:0)

如果您对连接感到满意,可以在where子句中使用左连接:

// Add the event listener
chart.addListener("init", zoomChart);

function zoomChart(e) {
  var chart = e.chart;
  var dataProvider = chart.dataProvider;

  // Zoom to the last 60 data items
  e.chart.zoomToIndexes(dataProvider.length - 60, dataProvider.length - 1);
}

此查询将保留一列中表Select t1.Id, t1.symptom from t1 A left join MyList B on lower(A.symptom) = lower(B.symptom) where lower(B.symptom) IS NULL; 的所有症状(A.symptom)和表t1对应的第二列(B.symptom),其值将与如果找到匹配项,则为t1中的症状;如果未找到匹配项,则为NULL。

你想要找不到匹配的那些,因此是where子句。

答案 2 :(得分:0)

您可以使用hive变量执行此操作。

SET hivevar:InClause=('coughing','sneezing','x',...)

确保你不要在平等的任何一边留下空格。

SELECT t1.Id,
       t1.symptom
 FROM  t1
WHERE LOWER(symptom) NOT IN ${InClause}