Чтобы расширить ответ на зомбат (который, я считаю, лучшим ответом), я создал рекурсивную версию его функции, которая принимает параметр $limit
, чтобы указать, сколько вхождений вы хотите заменить.
function str_replace_limit($haystack, $needle, $replace, $limit, $start_pos = 0) {
if ($limit <= 0) {
return $haystack;
} else {
$pos = strpos($haystack,$needle,$start_pos);
if ($pos !== false) {
$newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
return str_replace_limit($newstring, $needle, $replace, $limit-1, $pos+strlen($replace));
} else {
return $haystack;
}
}
}
Ниже для стандарта BigQuery Standard SQL
#standardSQL
SELECT Date, Product, 'CostPrice' AS MetricName, CostPrice AS MetricValue
FROM `project.dataset.table` UNION ALL
SELECT Date, Product, 'SalePrice' AS MetricName, SalePrice AS MetricValue
FROM `project.dataset.table`
Вы можете протестировать, играть с помощью выше, используя фиктивные данные из вашего вопроса, как показано ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT '01/01/2018' Date, 'hat' Product, 10 CostPrice, 20 SalePrice UNION ALL
SELECT '01/01/2018', 'shoe', 5, 12 UNION ALL
SELECT '01/02/2018', 'hat', 11, 22 UNION ALL
SELECT '01/02/2018', 'shoe', 6, 13
)
SELECT Date, Product, 'CostPrice' AS MetricName, CostPrice AS MetricValue
FROM `project.dataset.table` UNION ALL
SELECT Date, Product, 'SalePrice', SalePrice
FROM `project.dataset.table`
Другой вариант, чтобы избежать использования UNION ALL (поскольку он требует некоторого избыточного кода), как показано ниже
#standardSQL
SELECT DATE, Product, MetricName, MetricValue
FROM `project.dataset.table`,
UNNEST([STRUCT<MetricName STRING, MetricValue INT64>
('CostPrice', CostPrice), ('SalePrice', SalePrice)])