Левая часть выражения LIKE должна иметь значение varchar (фактически: varbinary). Какая альтернатива преобразованию varbinary в varchar?

У меня есть следующий запрос на dune.com:

SELECT
  th.value / 1e18 as amount,
  tr.success,
  th."from",
  th.to,
  tr.hash,
  tr.data,
FROM
  table1 tr
  table2 th ON tr.hash = th.evt_hash
WHERE
  th.to = sjhd21
  AND tr.success = true
  AND (
    th.value / 1e18 > 10
    OR th."from" = h123g
  ) 
  AND CAST(tr.data AS varchar) NOT LIKE '0xbc4b3365%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x447e346f%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x0100670b%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x2d1fb389%'
  AND CAST(tr.data AS varchar) NOT LIKE '0xb9181611%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x47e7ef24%'
  AND CAST(tr.data AS varchar) NOT LIKE '0xdb6b5246%'
  AND CAST(tr.data AS varchar) NOT LIKE '0xf80dec97%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x8129fc1c%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x8da5cb5b%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x7729d644%'
  AND CAST(tr.data AS varchar) NOT LIKE '0xd6c9b6a5%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x143531c0%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x715018a6%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x4fb2e45d%'
  AND CAST(tr.data AS varchar) NOT LIKE '0xf2fde38b%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x4f065632%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x7a78b9c7%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x535b355c%'
  AND CAST(tr.data AS varchar) NOT LIKE '0x9c66c25d%'

Обработка этого запроса занимает много времени. Я предполагаю, что это потому, что я конвертирую столбец данных в предложении WHERE.

Если я не конвертирую его, я получаю эту ошибку:

Левая часть выражения LIKE должна иметь значение varchar (фактически: varbinary).

Я пробовал использовать CTE для преобразования данных, но это все равно занимает столько же времени, поэтому я отказался от этого.

Какая альтернатива этому? Есть ли выражение, которое будет работать с данными как с varbinary?

Я не использую dune, но похоже, что вы просматриваете только первые 4 байта, поэтому у меня должна быть возможность использовать varbinary_substring и not in

Martin Smith 29.06.2024 19:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Приведение левого аргумента (нет) like вполне вероятно является причиной медленности, особенно если этот столбец проиндексирован.

Глядя на имеющиеся у вас условия, вы на самом деле не используете всю мощь оператора like, а используете его только для проверки префикса. Более эффективно это можно сделать с помощью функции varbinary_starts_with:

AND NOT varbinary_starts_with(tr.data, 0xbc4b3365)
-- etc...
AND CAST(tr.data AS varchar) NOT LIKE '0xb9181611%' Если это по сути числа, можете ли вы это сделать? AND NOT ( tr.data > 3105363473 and tr.data < 3105363474 ) Рассматривайте их как числа или сохраните версию числа, чтобы вы могли делать большее/меньше чем.
Paul Manley 30.06.2024 01:06

@PaulManley это сработает, только если вы что-то знаете о длине значения. В запросе ОП и в моем решении условие будет соответствовать таким значениям, как 0xbc4b336511111111. С вашим решением этого не произойдет.

Mureinik 30.06.2024 06:19

@Mureinik Не знаю насчет Дюны, но многие СУБД позволяют это сделать AND NOT (tr.data > 0xbc4b3365 AND tr.data < 0xbc4b3366)

Charlieface 01.07.2024 11:41

Другие вопросы по теме

Похожие вопросы

Чтобы получить предыдущую запись, которая меньше заданной даты и времени
Выберите строки с тем же кодом товара, но с другим значением в другом столбце
Извлечение и обработка подстроки между различным количеством разделителей в строке переменной длины
Потеря производительности из-за бокового соединения в запросе Postgres
Есть ли способ эффективно поддерживать правила крупномасштабных данных в SQL?
Выберите минимум или максимум в зависимости от того, где существует повторяющееся значение
Как я могу пронумеровать экземпляр повторяющейся записи?
Разъяснение по поводу объединений
Как я могу избежать «ОШИБКИ: нет уникального ограничения, соответствующего заданным ключам для ссылочной таблицы» при ссылке на первичный ключ комбинации в Postgres?
ORA-20999: Не удалось проанализировать SQL-запрос! ORA-06550: строка 4, столбец 82: ORA-00936: отсутствует выражение