Где моя синтаксическая ошибка в этом SQL CHECK CONSTRAINT?

Прошу прощения, но я выставил свой вопрос на google_and_ Мой вопрос такой сложный?

Для меня да.

У меня есть два столбца в таблице в базе данных SQL Server. Я проверил, что (int)Logicial_Value остается в [0;2] по

Логическое_значение МЕЖДУ 0 И 2

мне нужно проверить, если

Int_Value < 5000, КОГДА Logical_Value = 0

Int_Value > 9999, КОГДА Logical_Value = 2

(Подарок: я позволяю вам угадать, что должно означать Logical_Value = 1)

Мое выражение ограничения проверки:

CASE
WHEN Logical_Value = 0 THEN Int_Value < 5000
WHEN Logical_Value = 1 THEN Int_Value > 4999 AND Int_Value < 10000
WHEN Logical_Value = 2 THEN Int_Value > 9999
END

Черт, это не работает. Это просто позволяет любое значение для Int_Value в каждом случае. Обратите внимание, что SQL Server Management Studio выдает ошибку проверки ограничения «foo».

Теперь мой вопрос: почему он позволяет значения (он не может проверить ограничение, дорогой капитан), но почему он не может проверить, и, следовательно, каков правильный синтаксис?

Я чувствую, что у меня уже есть RTFM, да.

CASE так не работает. Синтаксис CASE WHEN <boolean expression> THEN <value> ELSE <value> END. Примечательно, что булевы выражения в T-SQL разрешены только в определенных контекстах и ​​нигде больше (настоящего независимого логического типа не существует), поэтому вы вообще не можете использовать CASE для указания условия (если только вы искусственно не сравниваете с 1 или 0 или подобным ). Вам нужно переписать это, используя AND и OR, например. (Logical_Value = 0 AND Int_Value < 5000) OR (Logical_Value = 1 AND ...).
Jeroen Mostert 10.02.2023 16:47

Вы не понимаете выражение case - оно возвращает одно скалярное значение, оно не выполняет управление потоком или логическую логику.

Stu 10.02.2023 16:49

Никогда (даже в диалектах SQL, поддерживающих логические значения) не используйте выражение case для вычисления логических значений на основе некоторых условий (других логических значений). Гораздо проще, логически правильно и читабельно выразить это булевыми условиями и операторами (и, или, не)

astentx 10.02.2023 16:55

@astentx Я думаю, что PostgreSQL правильно ведет себя с логическими предикатами ... во всех комбинациях CHECK и CASE, AND, OR и т. д.

The Impaler 10.02.2023 16:58

@TheImpaler Без сомнения, но зачем писать case вместо and для логических значений? Если вы хотите, чтобы A и B были истинными одновременно, тогда A and B понятно и работает одинаково во всех СУБД, а case when A then B end — нет. Единственным возможным случаем может быть применение некоторых условий, которые в противном случае будут оцениваться как ошибка (например, when data_type = 'int' then value = 5 when data_type = 'date' then value = date '1970-01-01' end)

astentx 10.02.2023 20:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

check (logical_value = 0 and int_value < 5000
    or logical_value = 1 and int_value between 5000 and 9999
    or logical_value = 2 and int_value > 9999)

Я всегда нервничаю, когда AND и OR смешиваются без круглых скобок, чтобы указать приоритет, даже в тех случаях, когда это оказывается правильным. Я видел слишком много неудачных запросов из-за того, что кто-то случайно добавил предложение туда, куда оно не должно было попасть, и задался вопросом, почему они возвращают все строки или не возвращают их вовсе.

Jeroen Mostert 10.02.2023 16:54

@nbk Я думаю, это должно работать правильно. Есть ли пропущенные скобки?

The Impaler 10.02.2023 16:55

Подтверждено, а объяснение @JeroenMostert похоже на рай!

mat.viguier 10.02.2023 16:55

@nbk здесь скобки не нужны, и мне кажется, что это очень чисто.

Salman A 10.02.2023 16:57

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

astentx 10.02.2023 16:58

@TheImpaler да, это правильно, но со скобками было бы яснее и понятнее,

nbk 10.02.2023 16:58

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

shawnt00 10.02.2023 17:05

Больше скобок? Это SQL, а не LISP.

jarlh 13.02.2023 08:00

Удобочитаемость — это то, насколько легко или сложно что-то читать.

mat.viguier 13.02.2023 10:20

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