【问题标题】:Concatenating columns not returning full results连接列未返回完整结果
【发布时间】:2020-02-19 02:53:34
【问题描述】:

我有一个表,我想将 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% 的时间都运行良好。

【问题讨论】:

  • 请给出表格的定义和样本数据。

标签: sql sql-server concatenation


【解决方案1】:

试试下面的查询。此处 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

这是db<>fiddle 演示。

【讨论】:

    【解决方案2】:

    这表明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
    

    【讨论】:

    • 感谢 concat 示例。出于某种原因,我认为 concat 一次只有 2 个变量。至于性别 `LEN(LTRIM(RTRIM(GENDER)))' 仍然给我一个长度为 2 的行不起作用,虽然对于起作用的行,它返回一个长度,但仍然包括一个空格(当不包括装饰时)
    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2019-10-19
    • 2021-12-08
    相关资源
    最近更新 更多