[image]

SQL

 
1 2 3 4 5 6 7 22

tank_bd

аксакал


Сообщение было перенесено из темы Специальность программиста.
yacc> Кстати, у меня у знакомого был вопрос такой, с той же задачи:
yacc> Есть запрос SELECT * FROM Workers WHERE salary = NULL
yacc> 1. Почему он работает неправильно ?
yacc> 2. Можно ли не меняя текст запроса заставить его работать правильно ?

ну так сравнение с NULL вроде бы всегда FALSE ? а значит выдача всегда пустая .... и возможно в некоторых диалектах оно работает своеобразно ...


з.ы. я не настоящий админ СУБД я мимо лежал так что кирпичами в меня не кидатся ...
   96.096.0
RU спокойный тип #19.01.2022 15:10  @tank_bd#19.01.2022 15:02
+
-
edit
 

спокойный тип
Спокойный_Тип

старожил
★★
yacc>> Кстати, у меня у знакомого был вопрос такой, с той же задачи:
yacc>> Есть запрос SELECT * FROM Workers WHERE salary = NULL
yacc>> 1. Почему он работает неправильно ?
yacc>> 2. Можно ли не меняя текст запроса заставить его работать правильно ?
t.b.> ну так сравнение с NULL вроде бы всегда FALSE ? а значит выдача всегда пустая .... и возможно в некоторых диалектах оно работает своеобразно ...
t.b.> з.ы. я не настоящий админ СУБД я мимо лежал так что кирпичами в меня не кидатся ...

там должно быть IS NULL а не = NULL, насколько помню

и соответственнно что бы это работало то нужно что бы колонка была типа варчара и по дефолту там была символьная строка "NULL".

зы
а вот кстати на вот на хадупе через хайв пример будет работать правильно насколько мне помнится, там же наллов нет и NULL идёт стрингом, что даёт много боли при экспорте\импорте...
   96.096.0
UA tank_bd #19.01.2022 15:22  @спокойный тип#19.01.2022 15:10
+
-
edit
 

tank_bd

аксакал


yacc>>> Кстати, у меня у знакомого был вопрос такой, с той же задачи:
с.т.> yacc>> Есть запрос SELECT * FROM Workers WHERE salary = NULL
с.т.> yacc>> 1. Почему он работает неправильно ?
с.т.> yacc>> 2. Можно ли не меняя текст запроса заставить его работать правильно ?
t.b.>> ну так сравнение с NULL вроде бы всегда FALSE ? а значит выдача всегда пустая .... и возможно в некоторых диалектах оно работает своеобразно ...
t.b.>> з.ы. я не настоящий админ СУБД я мимо лежал так что кирпичами в меня не кидатся ...
с.т.> там должно быть IS NULL а не = NULL, насколько помню
с.т.> и соответственнно что бы это работало то нужно что бы колонка была типа варчара и по дефолту там была символьная строка "NULL".
с.т.> зы
с.т.> а вот кстати на вот на хадупе через хайв пример будет работать правильно насколько мне помнится, там же наллов нет и NULL идёт стрингом, что даёт много боли при экспорте\импорте...


ну если писать правильно то да ІS NULL выведет строки в которых значение салари будет нулл если тупо сравнивать в большей части диалектов ничего не выведет .. за WHERE будет FALSE
   96.096.0

U235

старожил
★★★★★
Сообщение было перенесено из темы Специальность программиста.
tarasv> Деятели в стиле "я знаю SQL" отсекались еще до этого вопросами типа "вот есть табличка id сотрудника и последняя зарплата. Если сотрудник зарплату еще не получал то в поле последняя зарплата будет null.

А null вообще может быть значением в таблице базы данных? А то я, как 1Сник со стажем, привык что он возникает только при соединениях таблиц, если данные поля выбираются по таблице с котрой для данной строки соединения нет. То есть null - это указатель что данных по этому полю в БД нет. То есть например в запросе

Выбрать
Сотрудники.Ссылка КАК Сотрудник,
Зарплаты.Оклад КаК Оклад
ИЗ
Справочник.Сотрудники КАК Сотрудники
Левое Соединение Справочник.Зарплаты КАК Зарплаты
ПО Сотрудники.Ссылка = Зарплаты.Сотрудник

NULL будет в полях Оклад только для тех сотрудников, кого нет в таблице Зарплаты. Если они в той таблице есть, то хотя бы 0, но будет. Иногда может быть еще Неопределено, если поле с пустым значением множественного типа. Поэтому условие на NULL очень удобно использовать для нахождения отсутствующих данных
   97.0.4692.7197.0.4692.71

yacc

старожил
★★★
t.b.> ну так сравнение с NULL вроде бы всегда FALSE ?
Необязательно :)
   92.0.4515.10792.0.4515.107

yacc

старожил
★★★
U235> А null вообще может быть значением в таблице базы данных?
Сплошь и рядом
   92.0.4515.10792.0.4515.107

imaex

аксакал

Сообщение было перенесено из темы Специальность программиста.
yacc> Есть запрос SELECT * FROM Workers WHERE salary = NULL

null не может быть ничему равен, даже другому null
   1717

yacc

старожил
★★★
yacc>> Есть запрос SELECT * FROM Workers WHERE salary = NULL
imaex> null не может быть ничему равен, даже другому null
Этот запрос может возвращать данные
   92.0.4515.10792.0.4515.107

tank_bd

аксакал


t.b.>> ну так сравнение с NULL вроде бы всегда FALSE ?
yacc> Необязательно :)

Ну стандарт SQL считает что обязательно , но я в нюансах не копенгаген ....
   96.096.0

imaex

аксакал

yacc> Этот запрос может возвращать данные

В каком случае/реализации? Любопытно.

Кстати, забыл - на второй вопрос ответ "нет", кмк.
   1717

yacc

старожил
★★★
yacc>> Этот запрос может возвращать данные
imaex> В каком случае/реализации? Любопытно.
Очень просто, поставить для сессии к базе следующие свойства
ANSI_NULLS OFF
И он вернет данные :p

На второй вопрос ответ: Да
   92.0.4515.10792.0.4515.107

tank_bd

аксакал


yacc>>> Этот запрос может возвращать данные
imaex>> В каком случае/реализации? Любопытно.
yacc> Очень просто, поставить для сессии к базе следующие свойства
yacc> ANSI_NULLS OFF
yacc> И он вернет данные :p
yacc> На второй вопрос ответ: Да

не во всех диалектах ... на мускуле емнип оно неотрубаемо
   96.096.0

imaex

аксакал

yacc> ANSI_NULLS OFF

В Oracle нет такого ;) . Т.ч. в общем случае ответ на второй вопрос "нет".

Кста, а что означает неансишный null? null, он же, строго говоря, тип имеет. К чему приводится?
   1717

yacc

старожил
★★★
yacc>> ANSI_NULLS OFF
imaex> В Oracle нет такого ;) . Т.ч. в общем случае ответ на второй вопрос "нет".
Неправильно.
Вопрос был
Можно ли не меняя текст запроса заставить его работать правильно ?
 

Ответ на него - Да, поскольку можно найти СУБД где можно заставить заработать
Достаточно найди одну такую - например MS SQL
   92.0.4515.10792.0.4515.107

tank_bd

аксакал


yacc>>> ANSI_NULLS OFF
imaex>> В Oracle нет такого ;) . Т.ч. в общем случае ответ на второй вопрос "нет".
yacc> Неправильно.
yacc> Вопрос был
yacc> Ответ на него - Да, поскольку можно найти СУБД где можно заставить заработать
yacc> Достаточно найди одну такую - например MS SQL

это имхо неверный подход если ты ищеш SQLшика без привязки , искал бы спеца под конкретно MSSQL то мб было бы корректно
   96.096.0

imaex

аксакал

yacc> Ответ на него - Да

В частном случае. В общем случае - нет, ms sql тут не показатель и не законодатель. А в DB/2 как?
Кого больше - тех, что по правилам или тех, что "мы покупаем или продаём"?

Я удивлён, кстати. Зачем? Чтобы жизнь совсем мёдом не казалась? Null - это ж очень удобно.
   1717

yacc

старожил
★★★
yacc>> Ответ на него - Да
imaex> В частном случае. В общем случае - нет,
Изучай кванторы
Вопрос не был привязан к реализации конкретного движка SQL
Строгий математически ответ - ДА.
Через квантор существования
   92.0.4515.10792.0.4515.107

imaex

аксакал

yacc> Изучай кванторы

Не силён в математике. Я понял, кажись - это просто отступление от синтаксиса, а не от сути.
   1717

16-й

аксакал
★★
yacc>> Ответ на него - Да
imaex> В частном случае. В общем случае - нет, ms sql тут не показатель и не законодатель. А в DB/2 как?

Ну, мало ли. PostgreSQL:
transform_null_equals (boolean)
Когда этот параметр включён, проверки вида выражение = NULL (или NULL = выражение) воспринимаются как выражение IS NULL

imaex> Я удивлён, кстати. Зачем? Чтобы жизнь совсем мёдом не казалась? Null - это ж очень удобно.

Для какой-нибудь обратной совместимости с чем-то древним.
На кой, вот, скажем, в оракле пустая строка при сравнении идентична Null?
   96.0.4664.4596.0.4664.45

tank_bd

аксакал


16-й> Ну, мало ли. PostgreSQL:
16-й> transform_null_equals (boolean)
16-й> Когда этот параметр включён, проверки вида выражение = NULL (или NULL = выражение) воспринимаются как выражение IS NULL

есть проблема в том что если ты ищеш SQLльшика без привязки к диалекту ты можешь попасть на человека который с МS и Postgres не работал в принципе ...

при этом при нужде разобраться толковый спец нагуглит за минуты ...
   96.096.0

imaex

аксакал

16-й> На кой, вот, скажем, в оракле пустая строка при сравнении идентична Null?

Вообще-то нет, не идентична. Я уж испугался - проверил. :D

ступил, пардон
   1717
Это сообщение редактировалось 19.01.2022 в 18:04

16-й

аксакал
★★
16-й>> На кой, вот, скажем, в оракле пустая строка при сравнении идентична Null?
imaex> Вообще-то нет, не идентична. Я уж испугался - проверил. :D

Ну, может криво выразился.
select 1 from dual where '' IS NULL

1


1
   96.0.4664.4596.0.4664.45

16-й

аксакал
★★
t.b.> есть проблема в том что если ты ищеш SQLльшика без привязки к диалекту ты можешь попасть на человека который с МS и Postgres не работал в принципе ...

Я вообще, что сиквел в извращениях не одинок.
А по поводу искания - ищут все же, обычно, под что-то определенное. Хотя, да, перековаться под очередной диалект, хорошему спецу дело пары месяцев. Имею ввиду, чтоб стало как родное, и он перестал, например, в оракле искать пути через создание временных таблиц на лету, переварил, почему в разных субд одни и те же действия оптимизатора по разному называются и т.д. (Кстати, реально бесит.)
   96.0.4664.4596.0.4664.45
+
+1
-
edit
 

tank_bd

аксакал


16-й> Я вообще, что сиквел в извращениях не одинок.
диалектов так то тьма что там в мало юзабельных у нас чорт его знает ...


16-й> А по поводу искания - ищут все же, обычно, под что-то определенное. Хотя, да, перековаться под очередной диалект, хорошему спецу дело пары месяцев. Имею ввиду, чтоб стало как родное, и он перестал, например, в оракле искать пути через создание временных таблиц на лету, переварил, почему в разных субд одни и те же действия оптимизатора по разному называются и т.д. (Кстати, реально бесит.)

ну эт у всех айтишников так переход на другой язык тоже примерно столько времени занимает (хотя в некоторых случаях может и дольше) ...
   96.096.0

tarasv

аксакал

yacc>> Изучай кванторы
imaex> Не силён в математике. Я понял, кажись - это просто отступление от синтаксиса, а не от сути.

Это доказательство через знание что не все реализующие реляционные БД уважают заветы обобщенного дядюшки Кодда на все 100%.
Завет таков что NULL это особое значение и оно размножается в любых выражениях. В контексте where результат выражения null эквивалентен false.
   97.0.4692.7197.0.4692.71
1 2 3 4 5 6 7 22

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru