Nano Hash - криптовалюты, майнинг, программирование

Укажите значения для функции «нравится» из определенного столбца в таблице?

Я использую SQL Server 2014, и мне нужен запрос T-SQL, который использует функцию like для запуска в определенном столбце (c1) таблицы (t1), чтобы узнать, содержит ли он один из кодов из списка кодов, найденных в столбце ( c2) другой таблицы (t2).

Для упрощения вот сценарий и ожидаемый результат:

Таблица т1:

ID       Notes
101      (free text in this column)
102      ...
...      ...
115000   ...

Таблица t2 (список из более чем 300 кодов):

Code
FR110419
GB150619
...
DE111219

Что я ищу:

SELECT ID 
FROM t1
WHERE t1.Notes like (SELECT Code FROM t2)

Поскольку для работы подобного оператора требуется «%», я не понимаю, как построить эту строку.

Я провел некоторое исследование StackOverflow, и самое близкое решение, с которым я столкнулся, - это проблема mysql: как использовать LIKE с именем столбца

Любая помощь будет оценена по достоинству.


  • Что делать, если столбец Code имеет нулевое значение? Вернуть все или ничего? 04.10.2019
  • Столбец кода не будет иметь значение NULL, так как это список существующих используемых кодов. 04.10.2019

Ответы:


1

Кажется, вы ищете JOIN:

SELECT ID 
FROM t1
INNER JOIN t2 ON t1.Notes LIKE '%' + t2.Code + '%'

Если в одном и том же Note могут появляться разные Code, использование условия EXISTS с коррелированным подзапросом также является вариантом, поскольку это позволит избежать дублирования записей в выводе:

SELECT ID
FROM t1
WHERE EXISTS (
    SELECT 1 FROM t2 WHERE t1.Notes LIKE '%' + t2.Code + '%'
)
04.10.2019

2

Вы можете использовать cross apply с charindex следующим образом:

--Loading data
create table t1 (id varchar(10));
insert into t1 (id) values ('100100'),('200100'),('300100')
insert into t1 (id) values ('100200'),('200200'),('300200')
insert into t1 (id) values ('100300'),('200300'),('300300')
insert into t1 (id) values ('0100'),('0200'),('0300')
insert into t1 (id) values ('00010'),('00020'),('00030')

create table t2 (id varchar(10));
insert into t2 (id) values ('020'),('010')

select t.id
from t1 as t
cross apply t2 as t2
--where charindex(t2.id,t.id) > 0 -- simulates a double % one at the beginning and one at the end
--where charindex(t2.id,t.id) = 1 -- simulates a % at the beginning
where charindex(t2.id,t.id) = len(t.id)-len(t2.id)+1 -- simulates a % at the end

Единственное, таблица очень большая, это может быть медленным решением.

04.10.2019
  • Это очень хорошо. CHARINDEX будет работать лучше, чем оператор LIKE. 04.10.2019

  • 3

    Опираясь на то, что уже было опубликовано, вы можете создать индексированное представление, чтобы действительно ускорить работу.

    Используя образцы данных CTE6...

    --Loading data
    create table t1 (id varchar(10));
    insert into t1 (id) values ('100100'),('200100'),('300100')
    insert into t1 (id) values ('100200'),('200200'),('300200')
    insert into t1 (id) values ('100300'),('200300'),('300300')
    insert into t1 (id) values ('0100'),('0200'),('0300')
    insert into t1 (id) values ('00010'),('00020'),('00030')
    
    create table t2 (id varchar(10));
    insert into t2 (id) values ('020'),('010')
    GO
    
    --  The View
    CREATE VIEW dbo.vw_t1t2 WITH SCHEMABINDING AS
    SELECT     t1 = t1.id, t2 = t2.id, cb = COUNT_BIG(*)
    FROM       dbo.t1 AS t1
    CROSS JOIN dbo.t2 AS t2
    WHERE      CHARINDEX(t2.id,t1.id) > 0
    GROUP BY   t1.id, t2.id
    GO
    -- The index (may need to add something else to make UNIQUE)
    CREATE UNIQUE CLUSTERED INDEX uq_cl_vwt1t2 ON dbo.vw_t1t2(t1,t2);
    GO
    

    Это будет очень хорошо работать для операторов SELECT, но может повлиять на модификации данных для t1 и t2, поэтому убедитесь, что вы используете наименьший возможный тип данных и включаете только те столбцы, которые вам точно нужны (Varchar(10) хорош). Я включаю COUNT_BIG(), потому что это требуется в индексированных представлениях, использующих GROUP BY.

    04.10.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..