1 всегда равен 1 в SQL? - PullRequest
3 голосов
/ 25 января 2010

Я пытаюсь определить это стандартное поведение SQL для сравнения числа с символьной или строковой версией того же числа. Всегда ли SELECT 1 = '1' (или подобное) возвращает какое-то "истинное" значение (true, 1, 't' и т. Д.)? Я подтвердил это на PostgreSQL и MySQL, но не могу найти ресурс для SQL в целом.

Обновление: Цель вопроса заключается в том, что я пытаюсь выяснить, будет ли работать число без кавычек при выборе / вставке / обновлении / и т.д. из нечислового поля, значением которого является число.

Ответы [ 10 ]

6 голосов
/ 25 января 2010

SELECT 1='1' дает TRUE, поскольку '1' является правильным конструктором для INT во всех известных мне реализациях.

Но SQL использует строгую типизацию, смотрите:

# SELECT 1=CAST('1' AS TEXT);
ERROR:  operator does not exist: integer = text
LINE 1: SELECT 1=CAST('1' AS TEXT);
                ^
HINT:  No operator matches the given name and argument type(s). You might need to add  explicit type casts.

Что касается стандарта (SQL 92, 99 и 2003), то он выглядит неправильно:

     <literal> ::=
            <signed numeric literal>
          | <general literal>

     <general literal> ::=
            <character string literal>
          | <national character string literal>
          | <bit string literal>
          | <hex string literal>
          | <datetime literal>
          | <interval literal>

     <signed numeric literal> ::=
          [ <sign> ] <unsigned numeric literal>

     <unsigned numeric literal> ::=
            <exact numeric literal>
          | <approximate numeric literal>

     <exact numeric literal> ::=
            <unsigned integer> [ <period> [ <unsigned integer> ] ]
          | <period> <unsigned integer>

     <unsigned integer> ::= <digit>...

     <character string literal> ::=
          [ <introducer><character set specification> ]
          <quote> [ <character representation>... ] <quote>
            [ { <separator>... <quote> [ <character representation>... ] <quote> }... ]

, поскольку <quote> содержится только в <bit string literal>, <hex string literal>, ... но нев числовых литералах ...

2 голосов
/ 25 января 2010

«SQL в целом» не имеет понятия «истинного» значения.

В отличие от MySQL и PostgreSQL в Oracle и SQL Server, нельзя использовать внутренние типы данных в качестве логических значений в предложениях WHERE или WHEN.

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

В mydata нельзя использовать тип данных, чтобы эти запросы работали:

SELECT  1
WHERE   @mydata

или

SELECT  1
FROM    dual
WHERE   :mydata

Кроме того, стандарт SQL не предписывает порядок приведения типа.

Тип данных константы может быть приведен к типу данных столбца или наоборот.

Это может привести к проблемам, аналогичным описанным в в этом вопросе .

2 голосов
/ 25 января 2010

Во-первых, в SQL Server SELECT 1 = '1' недопустимо. Хотя, если вы запустите следующий код, вы обнаружите, что 1 делает = '1'

if (1 = '1') begin
    print 'true'
end else begin
    print 'false'
end

Результаты:

true
2 голосов
/ 25 января 2010

SQL Server

if 1 = '1'
print 'yes'
else
print 'no'

вывод: да

Это преобразуется, см. Здесь полный список неявных и явных возможностей преобразования: CAST и CONVERT (Transact-SQL)

1 голос
/ 25 января 2010

Тестируя из MySQL 5.x и SQL Server 2005, они оба выполняют неявное преобразование '1' в 1, чтобы оценка вернула true.

Но это также может быть связано с сопоставлением.

1 голос
/ 25 января 2010

1 - это число, а '1' - это какой-то массив CHAR, они никогда не должны быть равны. Если это так, то это поведение, зависящее от реализации

0 голосов
/ 25 января 2010

Из обновления:

Ваше обновление звучит так, как будто вы хотите сделать следующее:

SELECT *
FROM MyTable 
WHERE StringColumn = 1

Это не сработает. Если в этом строковом столбце есть ЛЮБЫЕ значения, которые не являются числовыми, как только движок sql попадет в эту строку, он выдаст ошибку. В MS SQL Server ошибка « Преобразование не удалось при преобразовании значения varchar 'blah' в тип данных int. "

Итак, если вы хотите сделать сравнение, вам нужно убедиться, что вы сравниваете как типы данных. Например:

SELECT *
FROM MyTable 
WHERE StringColumn = '1'
0 голосов
/ 25 января 2010

Вопрос (учитывая текст обновления) не если:

SELECT 1 = '1'

будет работать, но будет:

SELECT '1'::text = 1

работа. Что, конечно, нет. По крайней мере, на PostgreSQL и по очень веской причине.

0 голосов
/ 25 января 2010

Несмотря на то, что он работает во многих реализациях, в соответствии со стандартом SQL сравнение 1 = '1' недопустимо.

0 голосов
/ 25 января 2010

Для оператора выбора «всегда верно» просто используйте SELECT 1. Это всегда будет правдой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...