Что я делаю не так?

Всё о СУБД FireBird.
Ответить
svd
Сообщения: 3
Зарегистрирован: 15.08.2022 12:21:10

Что я делаю не так?

Сообщение svd »

Всем привет.
Есть запрос:

Код: Выделить всё

with taxfree_names as(
  select '' as textinname from rdb$database
  union
  select 'pill' from rdb$database
  union
  select 'book'  from rdb$database
  union
  select 'chocolat' from rdb$database
)
select (select count(*) from taxfree_names where 'packet of headache pills' like '%'||textinname||'%')
from rdb$database
он показывает в резккльтате 0. Вопрос почему?
если использую фразу, то возвращает 1:

Код: Выделить всё

with taxfree_names as(
  select '' as textinname from rdb$database
  union
  select 'pill' from rdb$database
  union
  select 'book'  from rdb$database
  union
  select 'chocolat' from rdb$database
  union
  select 'headache pill' from rdb$database
)
select (select count(*) from taxfree_names where'packet of headache pills' like '%'||textinname||'%')
from rdb$database
слово pills какоето заговоренное в Фаерберде?
fraks
Сообщения: 26
Зарегистрирован: 06.04.2022 11:27:22

Re: Что я делаю не так?

Сообщение fraks »

Вопрос понравился тем что можно легко воспроизвести :)
Попробовал - такая же фигня.
Но ответ нашелся достаточно быстро.

Выполняем

Код: Выделить всё

  select '' as textinname from rdb$database
  union
  select 'pill' from rdb$database
  union
  select 'book'  from rdb$database
  union
  select 'chocolat' from rdb$database
и смотрим тип поля. Он оказывается CHAR(8).
Соответственно, там лежат данные в таком формате:

Код: Выделить всё

'        '
'pill    '
'book    '
'chokolat'
Теперь понятно почему "не работает" like.

А во втором запросе работает потому что фраза - самое длинное значение среди входящих, по нему подравнивается тип выходного поля, и там просто нет конечных пробелов.

Убедиться в наличии концевых пробелов можно так:

Код: Выделить всё

with taxfree_names as(
  select '' as textinname from rdb$database
  union
  select 'pill' from rdb$database
  union
  select 'book'  from rdb$database
  union
  select 'chocolat' from rdb$database
)
select
  '|' || textinname || '|'
from taxfree_names

-------------------------
CONCATENATION
-------------------------
|        |
|book    |
|chocolat|
|pill    |
-------------------------

fraks
Сообщения: 26
Зарегистрирован: 06.04.2022 11:27:22

Re: Что я делаю не так?

Сообщение fraks »

Я бы еще рекомендовал обратить внимание на разницу между union и union all.
В данном случае - без разницы, но вообще разница может иметь значение.
Последний раз редактировалось fraks 06.09.2022 04:27:02, всего редактировалось 1 раз.
fraks
Сообщения: 26
Зарегистрирован: 06.04.2022 11:27:22

Re: Что я делаю не так?

Сообщение fraks »

Вот так работает. Показывает 2.

Код: Выделить всё

with taxfree_names as(
  select '' as textinname from rdb$database
  union
  select 'pill' from rdb$database
  union
  select 'book'  from rdb$database
  union
  select 'chocolat' from rdb$database
)
select (select count(*) from taxfree_names where 'packet of headache pills' like '%' || trim(textinname) || '%')
from rdb$database
svd
Сообщения: 3
Зарегистрирован: 15.08.2022 12:21:10

Re: Что я делаю не так?

Сообщение svd »

Спасибо коллеги,
про тип выпустил из виду, хотя ответ был очевиден (если бы ввыпод нанных обрамлял в кавычки).

Как говорят на руси: век живи, век извращайся.
Ответить