Skip to content

Commit f4c4ae6

Browse files
b-perdbeatty10
andauthored
Fix/557 split part negative part number (#559)
* Add support for negative part number for Postgres, Redshift and BigQuery * Add test for negative part_number * Keep the positive behaviour for part_number = 0 * Update CHANGELOG Co-authored-by: Doug Beatty <doug.beatty@dbtlabs.com> Co-authored-by: Doug Beatty <44704949+dbeatty10@users.noreply.github.com>
1 parent 7e3da7c commit f4c4ae6

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

CHANGELOG.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# Unreleased
22
## New features
33
- Add an optional `where` clause parameter to `get_column_values()` to filter values returned ([#511](https://github.com/dbt-labs/dbt-utils/issues/511), [#583](https://github.com/dbt-labs/dbt-utils/pull/583))
4-
5-
## New features
64
- Add `where` parameter to `union_relations` macro ([#554](https://github.com/dbt-labs/dbt-utils/pull/554))
5+
6+
## Fixes
7+
- Enable a negative part_number for `split_part()` ([#557](https://github.com/dbt-labs/dbt-utils/issues/557), [#559](https://github.com/dbt-labs/dbt-utils/pull/559))
8+
79
## Quality of life
810
- Documentation about listagg macro ([#544](https://github.com/dbt-labs/dbt-utils/issues/544), [#560](https://github.com/dbt-labs/dbt-utils/pull/560))
911
- Fix links to macro section in table of contents ([#555](https://github.com/dbt-labs/dbt-utils/pull/555))
@@ -18,6 +20,7 @@
1820
- [@judahrand](https://github.com/judahrand) (#552)
1921
- [@clausherther](https://github.com/clausherther) (#555)
2022
- [@epapineau](https://github.com/epapineau) (#583)
23+
- [@b-per](https://github.com/b-per) (#559)
2124

2225
# dbt-utils v0.8.4
2326
## Fixes

integration_tests/models/cross_db_utils/test_split_part.sql

+8
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,11 @@ select
2626
result_3 as expected
2727

2828
from data
29+
30+
union all
31+
32+
select
33+
{{ dbt_utils.split_part('parts', 'split_on', -1) }} as actual,
34+
result_3 as expected
35+
36+
from data

macros/cross_db_utils/split_part.sql

+48
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,59 @@
1414
{% endmacro %}
1515

1616

17+
{% macro _split_part_negative(string_text, delimiter_text, part_number) %}
18+
19+
split_part(
20+
{{ string_text }},
21+
{{ delimiter_text }},
22+
length({{ string_text }})
23+
- length(
24+
replace({{ string_text }}, {{ delimiter_text }}, '')
25+
) + 2 {{ part_number }}
26+
)
27+
28+
{% endmacro %}
29+
30+
31+
{% macro postgres__split_part(string_text, delimiter_text, part_number) %}
32+
33+
{% if part_number >= 0 %}
34+
{{ dbt_utils.default__split_part(string_text, delimiter_text, part_number) }}
35+
{% else %}
36+
{{ dbt_utils._split_part_negative(string_text, delimiter_text, part_number) }}
37+
{% endif %}
38+
39+
{% endmacro %}
40+
41+
42+
{% macro redshift__split_part(string_text, delimiter_text, part_number) %}
43+
44+
{% if part_number >= 0 %}
45+
{{ dbt_utils.default__split_part(string_text, delimiter_text, part_number) }}
46+
{% else %}
47+
{{ dbt_utils._split_part_negative(string_text, delimiter_text, part_number) }}
48+
{% endif %}
49+
50+
{% endmacro %}
51+
52+
1753
{% macro bigquery__split_part(string_text, delimiter_text, part_number) %}
1854

55+
{% if part_number >= 0 %}
1956
split(
2057
{{ string_text }},
2158
{{ delimiter_text }}
2259
)[safe_offset({{ part_number - 1 }})]
60+
{% else %}
61+
split(
62+
{{ string_text }},
63+
{{ delimiter_text }}
64+
)[safe_offset(
65+
length({{ string_text }})
66+
- length(
67+
replace({{ string_text }}, {{ delimiter_text }}, '')
68+
) + 1
69+
)]
70+
{% endif %}
2371

2472
{% endmacro %}

0 commit comments

Comments
 (0)