Как отобразить или преобразовать числовые значения как числа в текстовом поле - PullRequest
0 голосов
/ 12 марта 2020

У меня есть таблица со столбцом, который имеет тип данных text (varchar). Этот столбец преимущественно имеет числовые значения c, но иногда имеет текстовые значения. Когда есть текстовое значение, мне нужно показать значение как есть. Тем не менее, когда есть значение цифры 1027 *, мне нужно преобразовать его в десятичное значение.

Вот пример

enter image description here

Поскольку первая строка содержит текст «hrs», она должна отображаться как есть и отображать 12 часов Однако вторая строка действительно является числом и должна отображаться как 12.00.

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

SELECT 
  [id], 
  [myvalue], 
  (CASE WHEN REGEXP_INSTR([value], '^[-+]?[0-9]*\.?[0-9]+$')=0 THEN [value] ELSE CAST([value] AS DECIMAL(12,2)) END) AS [newvalue],
FROM 
  [mytable]
;

Я знаю, что это происходит, потому что типы данных для выходов для "THEN" и "ELSE" должны совпадать.

Любые другие идеи о том, как я мог бы сделать это?

Пара замечаний:

  1. Я знаю, что столбец "newvalue" по-прежнему будет считаться текстовым типом данных.
  2. Я не просто пытаюсь округлить или добавить ".00 «к моему результату. Выше приведен простой пример. Числовые значения c варьируются, и это действительно необходимо преобразовать в десятичное число.

1 Ответ

0 голосов
/ 13 марта 2020

Поскольку вы создаете столбец в наборе результатов, необходимо, чтобы создаваемый столбец имел один тип. В вашем случае вы преобразуете определенные значения в десятичное, что означает, что ваш столбец должен содержать два типа (varchar и decimal), и это не сработает.

Поскольку по крайней мере одно из ваших значений является varchar , они все должны быть (поскольку varchar не всегда может быть приведен к другим типам, таким как decimal или date или int или what-have-you).

Рассмотрим:

user=# SELECT CAST('1' AS DECIMAL(12,2));
 numeric 
---------
    1.00
(1 row)

user=# SELECT CAST(CAST('1' AS DECIMAL(12,2)) AS VARCHAR(100));
 varchar 
---------
 1.00
(1 row)

Итак, мы преобразовали строковый литерал 1 в десятичное число. База данных добавляет два десятичных знака в представлении этого десятичного числа, как и ожидалось. Затем мы возвращаем эту вещь обратно в varchar(), генерируя строковый литерал с двумя целыми десятичными разрядами.

Использование этого в вашем SQL (изменилось касание, так как я на postgres, а не на красное смещение):

user=# WITH mytable AS (SELECT 'car' as value UNION SELECT '1') 
       SELECT (CASE WHEN REGEXP_REPLACE(value, '^[-+]?[0-9]*\.?[0-9]+$', '')=value 
           THEN value 
           ELSE CAST(CAST(value AS DECIMAL(12,2)) AS VARCHAR(100)) 
           END) AS newvalue 
       FROM mytable;
 newvalue 
----------
 1.00
 car
(2 rows)
...