Как я могу привести int к немного в MySQL 5.1? - PullRequest
8 голосов
/ 03 августа 2011

Я перехожу с SQL Server на MySQL 5.1 и, похоже, запутался, пытаясь создать таблицу с помощью оператора select, чтобы столбец был немного.

В идеале будет работать следующее:

CREATE TABLE myNewTable AS
SELECT cast(myIntThatIsZeroOrOne as bit) AS myBit
FROM myOldtable

Тем не менее, sql очень недоволен кастингом. Как я могу сказать ему выбрать столбец int (который, как я знаю, имеет только 0 и 1) как бит?

Ответы [ 4 ]

12 голосов
/ 25 ноября 2013

Вы не можете!

CAST и CONVERT работают только на:

  • BINARY [(N)]
  • CHAR [(N)]
  • DATE
  • DATETIME
  • DECIMAL [(M [, D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED[INTEGER]

Нет места для: BIT, BITINT, TINYINT, MEDIUMINT, BIGINT, SMALLINT, ...

Однако вы можете создать свою собственную функцию cast_to_bit (n):

DELIMITER $$

CREATE FUNCTION cast_to_bit (N INT) RETURNS bit(1)
BEGIN
    RETURN N;
END

Чтобы попробовать сами, вы можете создать представление с несколькими преобразованиями, такими как:

CREATE VIEW view_bit AS
    SELECT
        cast_to_bit(0),
        cast_to_bit(1),
        cast_to_bit(FALSE),
        cast_to_bit(TRUE),
        cast_to_bit(b'0'),
        cast_to_bit(b'1'),
        cast_to_bit(2=3),
        cast_to_bit(2=2)

... и затем описать его!

DESCRIBE view_bit;

Ta-dah !!Все сейчас немного (1) !!!

3 голосов
/ 30 мая 2014

Попробуйте CONV(N,from_base,to_base)

Преобразует числа между различными номерами. Возвращает строковое представление числа N, преобразованное из базы from_base в базу to_base. Возвращает NULL, если любой аргумент равен NULL. Аргумент N интерпретируется как целое число, но может быть указан как целое число или строка. Минимальное основание равно 2, а максимальное - 36. Если to_base - отрицательное число, N рассматривается как число со знаком. В противном случае N считается неподписанным. CONV() работает с 64-битной точностью.

например.

select CONV(9, 10, 2);
1 голос
/ 27 июня 2014

Попробуйте использовать кейс:

CREATE TABLE myNewTable AS
SELECT (case myIntThatIsZeroOrOne when 1 then true else false end) AS myBit
FROM myOldtable
1 голос
/ 03 августа 2011

Попробуйте указать длину для типа данных в битах.

CREATE TABLE myNewTable AS
SELECT cast(myIntThatIsZeroOrOne as bit(1)) AS myBit
FROM myOldtable
...