在CONCAT中使用Collate

25

我试图在两个列之间用空格连接它们,但是遇到了排序规则错误:

SELECT DISTINCT
    p.PERSON_ID,
    p.ID_NUMBER,
    CONCAT(p.FULLNAMES, CONCAT(' ', p.SURNAME)) AS NAME,
    o.ORG_NAME,
    w.WARD_DESCRIPTION AS WARD,
    ess.DESCRIPTION AS SECTOR

在连接操作中无法解决 "SQL_Latin1_General_CP1_CI_AS" 和 "Latin1_General_CI_AS" 之间的排序冲突

我数据库里两个有问题的列的排序规则都是:Latin1_General_CI_AS

因此,我试图将空格与此排序规则匹配,但我不知道如何做到这一点。 我的尝试:

CONCAT(p.FULLNAMES, (CONCAT((COLLATE Latin1_General_CI_AS = ' '), p.SURNAME))) AS NAME,

还是其他的什么?

3个回答

23
您需要在每个字段后面加上COLLATE,即在最坏的情况下:
SELECT DISTINCT
    CONCAT(p.FULLNAMES COLLATE Latin1_General_CI_AS, 
      (CONCAT(' ' COLLATE Latin1_General_CI_AS, 
          p.SURNAME COLLATE Latin1_General_CI_AS))) AS NAME
FROM Person p

2
您可以通过使用DATABASE_DEFAULT进行排序,从而避免对文字进行排序,例如 SELECT DISTINCT CONCAT(p.FULLNAMES COLLATE DATABASE_DEFAULT, (CONCAT(' ', p.SURNAME COLLATE DATABASE_DEFAULT))) AS NAME FROM Person p - StuartLC
1
@StuartLC,那可能会破坏你的<order by>。最好将空格更改为与其他列相同的排序规则。 - t-clausen.dk

5
这将解决你的问题:
SELECT CONCAT(p.FULLNAMES,' ' collate Latin1_General_CI_AS,p.SURNAME) AS NAME

这个空间将会使用与数据库相同的默认排序规则,因此它必须与您的列具有相同的排序规则。在我看来,这有点傻。


2

我通过使用连接运算符来解决了这个问题:

p.FULLNAMES + ' ' + p.SURNAME

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接