@Djasar

Replace\CAST\ISNULL как применить?

Есть таблица в MSSQL с столбцом column(nvarchar (50)), значения
46546546
45.04545
4545.5454
5.0
545.0
0.0
0.025
NULL

Проблема в значениях типа 5.0 так как их мне нужно преобразовать в просто 5, а NULL в sale
Пробывал запросы
CAST(CAST(ISNULL(column,'sale') as float) as nvarchar)  
  --float округляет и значения  NULL мешают в преобразовании
REPLACE(ISNULL(column, 'sale'),'.0$','') 
  --не срабатывает
  • Вопрос задан
  • 48 просмотров
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
DECLARE @Table TABLE ( [Column] NVARCHAR(50))
INSERT @Table VALUES
('46546546'),
('45.04545'),
('4545.5454'),
('5.0'),
('545.0'),
('0.0'),
('0.025'),
(NULL)

SELECT ISNULL(FORMAT( CAST( [Column] AS FLOAT ), '', 'en-US' ), 'sale')
  FROM @Table

Результат:
46546546
45.04545
4545.5454
5
545
0
0.025
sale

Другой вариант
DECLARE @Table 
  TABLE ( [Column] NVARCHAR(50),
          [ColumnNeed] AS ISNULL(FORMAT( CAST( [Column] AS FLOAT ), '', 'en-US' ), 'sale'));
INSERT @Table VALUES
('46546546'),
('45.04545'),
('4545.5454'),
('5.0'),
('545.0'),
('0.0'),
('0.025'),
(NULL)

SELECT ColumnNeed
  FROM @Table

Результат тот же.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@mletov
Проблема в значениях типа 5.0 так как их мне нужно преобразовать в просто 5


В общем случае CAST AS INT. Но вообще надо детальнее. Что с остальными десятичными, что в какую сторону округляется, опишите логику целиком

а NULL в sale

Используйте CASE
WHEN
или IIF

типа

CASE 
WHEN val IS NULL
THEN "sale"
END


Но в любом случае все надо привести к NVARCHAR в конечном счете
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
SELECT CASE WHEN [column] IS NULL
            THEN 'sale'
            WHEN CHARINDEX([column], '.') > 0
            THEN LEFT([column], CHARINDEX([column], '.') - 1)
            ELSE [column] 
            END AS [column] 
FROM source_table;


как есть 2-я таблица с такимеже значениями только без .0 и без NULL . А мне в дальнейшем нужно сравнить эти 2 таблицы


Соответственно
SELECT *
FROM table1
JOIN table2 ON table1.[column] = CASE WHEN table2.[column] IS NULL
                                      THEN 'sale'
                                      WHEN CHARINDEX(table2.[column], '.') > 0
                                      THEN LEFT(table2.[column], CHARINDEX(table2.[column], '.') - 1)
                                      ELSE table2.[column] 
                                      END;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы