Мне было скучно, поэтому я написал это. Это хранимая процедура, которая создаст или заменит представление ITEM_VIEW в соответствии с вашим описанием выше. Обратите внимание, что в ваших данных есть небольшое несоответствие. Свойство для телефона в JSON - «модель», но в таблице «СВОЙСТВА» - «производитель».
Каждый раз, когда вы изменяете таблицу PROPERTIES, вам необходимо запустить хранимую процедуру, чтобы перестроить представление. Я поместил оператор SQL и предложения в шаблоны, чтобы вы могли изменить их по мере необходимости.
Как видно из кода, хранимая процедура ожидает таблицу с именем PROPERTIES и таблицу с именем ITEMS. Если ваши фактические имена таблиц отличаются, вы можете изменить их в коде и / или SQL шаблонах, где вы их найдете.
create or replace procedure CREATE_ITEM_VIEW()
returns string
language javascript
as
$$
var nameClause = "";
var brandClause = "";
var priceClause = "";
var category, purpose, dataType, property;
var rs = GetResultSet("select * from PROPERTIES");
while (rs.next()){
category = rs.getColumnValue("CATEGORY");
purpose = rs.getColumnValue("PURPOSE");
property = rs.getColumnValue("PROPERTY_NAME");
dataType = rs.getColumnValue("PROPERTY_DATA_TYPE");
if (purpose == 'name'){
nameClause += GetColumn(category, property, dataType) + "\n";
}
if (purpose == 'brand'){
brandClause += GetColumn(category, property, dataType) + "\n";
}
if (purpose == 'price'){
priceClause += GetColumn(category, property, dataType) + "\n";
}
}
var viewSQL = GetViewSQL(nameClause, brandClause, priceClause);
return ExecuteSingleValueQuery("status", viewSQL);
// ----------------------End of Main Function ---------------------------------------
function GetColumn(category, name, dataType){
var sql = "when '@~CATEGORY~@' then PROPERTIES:@~NAME~@::@~NAME_DATA_TYPE~@";
sql = sql.replace(/@~CATEGORY~@/g, category);
sql = sql.replace(/@~NAME~@/g, name);
sql = sql.replace(/@~NAME_DATA_TYPE~@/g, dataType);
return sql;
}
function GetViewSQL(nameClause, brandClause, priceClause){
var sql = `
create or replace view ITEM_VIEW as
select ITEM_ID,
CATEGORY,
case CATEGORY
${nameClause}
end as "NAME",
case CATEGORY
${brandClause}
end as BRAND,
case CATEGORY
${priceClause}
end as PRICE
from ITEMS;
`;
return sql;
}
function GetResultSet(sql){
cmd1 = {sqlText: sql};
stmt = snowflake.createStatement(cmd1);
var rs;
rs = stmt.execute();
return rs;
}
function ExecuteSingleValueQuery(columnName, queryString) {
var out;
cmd1 = {sqlText: queryString};
stmt = snowflake.createStatement(cmd1);
var rs;
rs = stmt.execute();
rs.next();
return rs.getColumnValue(columnName);
return out;
}
$$;
После создания хранимой процедуры запустите ее следующим образом, и она будет создайте свой вид:
call create_item_view();
select * from ITEM_VIEW;