我的 select case when 语句有问题,我想在 select case when 语句中添加一个新列,我得到了结果,但是?????
因为我已将该列设置为阿拉伯语单词,所以我尝试将内容转换为不幸nvarchar(55)
的是,我得到了相同的结果。
我怎样才能得到正确的结果?
SELECT case when ( CAST(o.startTime as time(7)) > cast(Start as time(7)))
then cast('قدوم' as nvarchar(55))
else cast('رجوع' as nvarchar(55)) end as stat,
userId, FirstName
from Users, TimeTable
由于您使用的是 Unicode / UTF-16 (ie
NVARCHAR
),因此您不需要排序规则,CAST
甚至不需要Arabic_*
排序规则。字符串文字的唯一要求是在它们前面加上一个大写的“N”:(该
-o-
字段用作分隔符,以防止阿拉伯和希伯来代码点固有的双向格式在以 HTML 呈现时显示查询下方 T-SQL 注释左侧的第二列)使用时
NVARCHAR
(包括NCHAR
和 should-never-be-usedNTEXT
),编码始终为 UTF-16,因此字符集永远不会改变(它始终是 Unicode,它是单个字符集)。在这种情况下,排序规则主要影响排序和比较(这里没有做)。如果您使用的是
VARCHAR
,则需要使用阿拉伯语排序规则来设置代码页以支持阿拉伯字符(Windows 代码页 1256)。'قدوم'
您最初返回的原因????
是字符串文字没有以 为前缀N
,使其成为VARCHAR
字符串,在这种情况下,它被转换为与您正在使用的当前数据库的默认排序规则相关联的代码页,这显然不是阿拉伯语整理。这种转换发生在最初解析查询时,这意味着您的字符串????
在强制转换操作将其转换为NVARCHAR
. 如果您一直在使用具有阿拉伯语默认排序规则的数据库,那么即使没有N
前缀,您的字符串文字也可以工作,而CAST
toNVARCHAR
也同样不必要。有关使用字符串/编码/Unicode/排序规则的更多信息,请访问我的网站:排序规则信息
PS 我建议你不要做旧式的 JOIN,比如
FROM TableA, TableB WHERE TableA.JoinColumn = TableB.JoinColumn
. 虽然该语法尚未被弃用,但相关的外连接语法 -*=
并且=*
- 实际上已在 SQL Server 2005 中删除。因此,为了保持一致性(而且就个人而言,我也会增加可读性),您应该改用该INNER JOIN
子句。此外,最好在对象名称前加上其 Schema 名称。最终结果是:在这种情况下,因为您
NVARCHAR
在您的演员表中使用了支持整个Unicode字符集的数据类型,所以您从临时字符串的前缀中缺少的只是N
表示 SQL Server 将字符串视为 的字符NVARCHAR
,此时使您的CAST()
函数调用变得多余并且也不需要。例如SELECT N'Some Text'
,将产生一个NVARCHAR
字符串,而不是仅仅SELECT 'Some Text'
产生一个VARCHAR
字符串。Solomon Rutzky 的回答也提供了一个明确的例子,提供了更深入的信息。
对于在使用(或类似)数据类型时遇到此问题的任何人
VARCHAR
,以下是您正在寻找的机器人:您需要在列、表、数据库或服务器实例级别使用支持排序规则的阿拉伯字符,例如
Arabic_CI_AI_KS_WS
.这个StackOverflow 答案有很好的信息。
对于临时查询和值,您应该能够根据需要使用该
COLLATE
函数。例如,如果我们需要使用您的上述查询VARCHAR
: