powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB3, join vs LIKE vs case-sensitivity
25 сообщений из 43, страница 1 из 2
FB3, join vs LIKE vs case-sensitivity
    #39833189
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень неконкретный отчёт.

https://stackoverflow.com/questions/56858452/why-did-my-where-clause-affect-my-left-join

Якобы, сравниваются два запроса на одной БД.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT * FROM MAIN_TABLE
LEFT JOIN PRODUCTS 
ON MAIN_TABLE.code = PRODUCTS.code
WHERE MAIN_TABLE.code LIKE '%abc%'

-- либо

WHERE MAIN_TABLE.code LIKE '%ABC%'



Якобы, в обоих случаях находится одна и та же строка мастер-таблицы (с кодом 'ABC').
Но при этом из вторoй таблицы строка подтягивается только во втором случае, а в первом - NULL.

Кто-нибудь сталкивался с чем-то таким ?
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833191
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.07.2019 12:09, Arioch пишет:
> Кто-нибудь сталкивался с чем-то таким ?

только читал про такие симптомы.
это грибы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833198
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

Ты бы хоть поглядел, что именно оно якобы возвращает.
Если в первом случае LEFT JOIN не отобрал, то как у него вернулось значение в PRODUCTS.code?

Короче, мы такое не курим.
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833246
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я глядел, и даже вопрос про это в комментах оставил
а вот ты, стало быть, не глядел

пример он явно "из головы" делал, а не из реальной БД с реальными чужими данными
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833251
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там разные коллейты в сравниваемых полях.
На это никто не обратил внимание.
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833265
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

это предполагается, но точно не названо

в любом случае, это ведь не должно менять результат
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833278
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.к. пациент явно путается в показаниях и пишет не то что видит - это важно.
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833299
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК, воспроизвожу на коленке на FB 2.1 (что под руками было)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
create table t_CI (
  id VarChar(10) character set UTF8 primary key collate UNICODE_CI,
  payload integer
)

create table t_CS (
  id VarChar(10) character set UTF8 primary key collate UNICODE,
  payload integer
)

-- что primary key надо вставлять МЕЖДУ charset и collate - это интересно кто так догадался?

insert into t_CS values ( 'ABCD', -100 );

insert into t_CI values ( 'ABCD', +22 );


select * from T_CS,  T_CI where T_CS.id = T_CI.id

select * from T_CS
 left join T_CI on T_CS.id = T_CI.id

select * from T_CI
 left join T_CS on T_CS.id = T_CI.id

select * from T_CI
 left join T_CS on T_CS.id = T_CI.id
 where T_CI.id like '%BC%'

select * from T_CS
 left join T_CI on T_CS.id = T_CI.id
 where T_CS.id like '%BC%'

-- OK: data ~ data

select * from T_CS
 left join T_CI on T_CS.id = T_CI.id
 where T_CS.id like '%bc%'

-- OK:  NULL ~ NULL

select * from T_CI
 left join T_CS on T_CS.id = T_CI.id
 where T_CI.id like '%bc%'

-- ?????  data ~ NULL  ?????



Как-то это ненормально....
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833302
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем видe:

Kакие charset/collate используются для вычисления "T_CS.id = T_CI.id" ?

Те же самые по идее надо использовать, если решили - ** на основе именно этого условия ** - спускать LIKE на уровень ниже
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833304
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

прекратите использовать дурацкие * для начала. Не хрена ж не понятно какие поля и в каком порядке выводятся.

и результат в таком виде не фига не понятный

Arioch-- OK: data ~ data

что нельзя написать какие именно значения выводятся?

автор-- ????? data ~ NULL ?????

если оба поля из T_CS равны NULL, то как раз всё нормально, а вот если как у автора на stackoverflow, то нет
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833306
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам скрипт в зубы дали, готовый, запустите и форматируйте как вам удобно.

Какие данные выводятся вполне понятно - в каждой таблицы одна единственная строчка. Она либо выводится, либо нет.
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833312
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> если оба поля из T_CS равны NULL, то как раз всё нормально

это НЕ нормально, потому что необъяснимо с точки зрения SQL
на T_CS там условие одно единственное и на этих данных оно выполняется ВСЕГДА, независимо от коллейтов

что оптимизатор крышей поехал, такая реализация - да, *так* объяснимо
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833322
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ну вообще-то там конечно есть недостаток в том, что предикат фильтрации может проталкиваться далее через условия сравнения. Но в большинстве случаев это несёт пользу.

А вот как можно додумался условие связи делать по текстовым полям с разными COLLATE вот это вопрос к проектировщику.
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833323
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.07.2019 14:20, Arioch пишет:
> что primary key надо вставлять МЕЖДУ charset и collate - это интересно кто так догадался?

создатели стандарта SQL.
(на заре компьютерной эпохи)

вообще-то, так не надо делать.
по хорошему, для PK нужно декларировать CONSTRAINT.
Код: sql
1.
2.
3.
4.
create table t_CS (
  id VarChar(10) character set UTF8 collate UNICODE,
  payload integer,
  CONSTRAINT PK_t_CS PRIMARY KEY(ID));



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833325
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выше план не читать, он от другого запросу. От проблемного ожидаемое
Код: plaintext
1.
2.
3.
4.
Plan:
PLAN JOIN (T_CI NATURAL, T_CS INDEX (RDB$PRIMARY3))

Adapted plan:
PLAN JOIN (T_CI NATURAL, T_CS INDEX (INTEG_21))
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833330
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и ещё ожидаемое, если всё-таки подключить индекс по мастер-таблице, а не по подчинённой, то снова работает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select * from T_CI
 left join T_CS on T_CS.id = T_CI.id
 where T_CI.id starting with 'abc'

-- OK: data ~ data

/*
Plan:
PLAN JOIN (T_CI INDEX (RDB$PRIMARY2), T_CS INDEX (RDB$PRIMARY3))

Adapted plan:
PLAN JOIN (T_CI INDEX (INTEG_19), T_CS INDEX (INTEG_21))
*/ 
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833334
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа вот ты, стало быть, не гляделЯ все комменты не читаю. Много воды, мусора и вот этого.
AriochВыше план не читать
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833336
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понимаю, из (T_CS.id = T_CI.id) и (T_CI.id like '%bc%') оптимизатор вывел еще и (T_CS.id like '%bc%'), которое есс-но вычисляется как false внутри условия джойна, возвращая NULL для правой части.
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833340
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Это несёт пользу, но если делать правильно....

А почему нельзя? а связки по полям разного числового типа можно делать или тоже запрещено? bigint и smallint например можно сравнивать в JOIN'e ?
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833346
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

ну это единственное объяснение.... т.е. оптимизатор догадался пропихнуть вниз LIKE но не догадался пропихнуть связанный с этим условиенм charset&collate

плюс наложился натуральный скан мастер-таблицы ввиду поиска не с начала строки
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833351
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто для добавления новых предикатов по принципу эквивалентности, недостаточно брать за основу любое равенство. Надо еще убедиться, что коллейты по обе стороны совпадают. Вот тогда можно оптимизировать как сейчас. А иначе нефиг.
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833355
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

на мой взгляд нужно проталкивать вместе с коллейтом

когда ты сравниваешь signed int 32 и unsigned int 32 ты оба расширяешь до int 64, например

с чарсетами и коллейтами должно происходить аналогичное приведение к некоему общему надмножеству

и оно должно использоваться не только для самого сравнения, но и для всех вторичных, порождённых этим сравнением действий

Но это "идеалистическoе" рассуждение, 21919886
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833361
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ещё такие конструкции вспомнить

www.destructor.de/firebird/charsets.htmYou can also specify the collation with the ORDER BY clause:
ORDER BY LASTNAME COLLATE FR_CA, FIRSTNAME COLLATE FR_CA

or with the WHERE clause:
WHERE LASTNAME COLLATE FR_CA = :lastnametosearch

or when searching:
WHERE UPPER (LAST_NAME COLLATE SV_SV) = 'PAULSEN';

> для добавления новых предикатов

т.е. фактически это разные предикаты

есть предикат (T_CS.id collate UNICODE like '%bc%')
а есть другой предикат (T_CS.id collate UNICODE_CI like '%bc%')

и добавляется неверный предикат....
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833367
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochкогда ты сравниваешь signed int 32 и unsigned int 32 ты оба расширяешь до int 64, например
с чарсетами и коллейтами должно происходить аналогичное приведение к некоему общему надмножествуС чего это вдруг вы решили, что такое "общее надмножество" существует?
Болгарскую кодировку хоть раз видели? А ведь это тоже кирилица.
...
Рейтинг: 0 / 0
FB3, join vs LIKE vs case-sensitivity
    #39833369
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochесть предикат (T_CS.id collate UNICODE like '%bc%')
а есть другой предикат (T_CS.id collate UNICODE_CI like '%bc%')

Бинго!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select * from T_CI
 left join T_CS on T_CS.id = T_CI.id
 where T_CI.id like '%bc%'

-- ERROR: data ~ NULL

select * from T_CI
 left join T_CS on T_CS.id = T_CI.id
 where T_CI.id collate unicode like '%bc%'

-- OK: NULL ~ NULL

select * from T_CI
 left join T_CS on T_CS.id = T_CI.id
 where T_CI.id collate unicode_ci like '%bc%'

-- OK: data ~ data
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB3, join vs LIKE vs case-sensitivity
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]