Объединение столбцов не дает полных результатов - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть таблица, в которую я хочу объединить 4 столбца; 2 из них являются целыми числами, 1 текст и 1 дата.

Я соединил их, приведя целые числа к varchar и отформатировав дату. Но у меня есть пример, когда последний элемент не отображается

SELECT 
    CAST(CONTRACT_ID VARCHAR(15)) + '-' +
    CAST(CONTRACT_TYPE AS VARCHAR(15))  + '-' +
    GENDER + '-' + FORMAT(DOB, 'yyyy') AS UNIQUE_ID

Есть 4 строки, которые должны иметь одинаковый вывод, тогда они отличаются.

- 12345678-70-M -1948
- 12345678-70-M
- 12345678-70-M
- 12345678-70-M

Но при запуске как результаты в текст, правильные результаты возвращают

- 12345678-70-M -1948
- 12345678-70-M -1948
- 12345678-70-M -1948
- 12345678-70-M -1948

Это не визуальная ошибка в сетке, потому что если я сделаю фильтр на нем, он вернет только 1 строку.

Однако я заметил, что если я приведу пол к varchar(1), результаты сработают. Может ли быть скрытый символ в конце поля пола, который вызывает проблему.

Кажется, он работает нормально в 99% случаев.

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Попробуйте запрос ниже. Здесь тип данных столбца DOB - DateTime, и это значение только для выборки, т.е. текущей даты.

create table test (CONTRACT_ID VARCHAR(15),
CONTRACT_TYPE VARCHAR(15),
GENDER Char(1),
DOB Datetime
)

 Insert into test Values
('12345678', '70', 'M', Getdate()),
('12345678', '70', 'M', Getdate()),
('12345678', '70', 'M', Getdate()),
('12345678', '70', 'M', Getdate())

Select * from test

SELECT 
    CAST(CONTRACT_ID as VARCHAR(15)) + '-' +
    CAST(CONTRACT_TYPE AS VARCHAR(15))  + '-' +
    GENDER + '-' + FORMAT(DOB, 'yyyy') AS UNIQUE_ID
    from test

enter image description here

Вот db <> fiddle demo.

0 голосов
/ 19 февраля 2020

Это говорит о том, что в GENDER есть пробелы или какой-либо другой символ. Попробуйте это:

SELECT CONCAT(CONTRACT_ID, '-', CONTRACT_TYPE, '-',
              LTRIM(RTRIM(GENDER)), '-', YEAR(DOB)
             ) AS UNIQUE_ID

Другая возможность состоит в том, что GENDER имеет некоторый символ, такой как символ новой строки в конце. Похоже, что первый символ правильный, поэтому:

SELECT CONCAT(CONTRACT_ID, '-', CONTRACT_TYPE, '-',
              LEFT(GENDER, 1), '-', YEAR(DOB)
             ) AS UNIQUE_ID
...