Google BigQuery: как проверить, содержит ли строка Year отрицательные значения

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

Не могли бы вы помочь мне со следующей ситуацией в Google BigQuery? Я пытаюсь определить, есть ли отрицательные значения в столбце таблицы с именем Year (т.Е. -1999).

Я искал в Интернете по всему миру множество типов вопросов (включая StackOverflow). Из всего этого я узнал, что это можно сделать с использованием РЕГИСТРА. Итак, я написал код, который вы видите ниже.

 SELECT
    CASE WHEN Year <0 THEN 1 ELSE 0 END
    FROM `project.dataset.datatable`
  

Но, к сожалению, при запуске код выдает следующую ошибку:
Нет совпадающей подписи для operator < для типов аргументов: STRING, INT64 . Поддерживаемые подписи: ЛЮБЫЕ < ЛЮБЫЕ в [2:15]

Я подумал, что это может быть связано с тем, что столбец Year определяется как СТРОКА, а не ЦЕЛОЕ ЧИСЛО. Поэтому я попытался использовать этот код для форматирования значений как INT.

 SELECT 
    CAST(Year AS INT64) AS Year_INT
    FROM `project.dataset.datatable`
  

Код работает, так как в нем отображаются значения. Но есть только 100 значений вместо 103, которые показывает стандартный SELECT DISTINCT. Похоже, что-то не так.

(!) Имя столбца и имя таблицы, имя набора данных и название проекта не являются реальными. Они были заменены мной для ограничения конфиденциальности.

Я хочу, чтобы запрос показывал мне все отрицательные годы, если таковые имеются. Например, если столбец Year содержит год -1999 (проблема с качеством данных), то строка должна перенести его вперед и другим подобным.

Ответ №1:

Это будет работать как ваше описание

 SELECT Year
FROM `project.dataset.datatable`
WHERE CAST(Year AS INT64) < 0
  

Ответ №2:

Вместо приведения значения к INT вы можете напрямую искать дефис в строке:

 where year like '%-%'
  

Это, вероятно, дешевле, чем приведение.

Комментарии:

1. Спасибо, Dnoeth! Полезно знать! 🙂

2. @dnoeth . . . Почему вы используете '%-%' вместо '-%' ?

3. @GordonLinoff: требования к качеству данных могут также включать начальные пробелы перед дефисом (или дефис в любом другом месте)