当字符串包含阿拉伯语单词时,如何在 SELECT CASE 中创建新列?

abd*_*u31 2 sql-server collation case encoding unicode

我的 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
Run Code Online (Sandbox Code Playgroud)

Sol*_*zky 6

由于您使用Unicode / UTF-16(即NVARCHAR),你没有需要要么CAST甚至是Arabic_*归类。字符串文字的唯一要求是用大写字母“N”作为前缀:

SELECT '????' COLLATE Arabic_CI_AS, '-o-' AS [-o-], '????' COLLATE Arabic_CI_AS;
-- ???? -o- ????

SELECT N'????' COLLATE French_CI_AS, '-o-' AS [-o-], N'????' COLLATE French_CI_AS;
-- ???? -o- ????
Run Code Online (Sandbox Code Playgroud)

(该-o-字段用作分隔符,以防止阿拉伯语和希伯来语代码点固有的双向格式在以 HTML 呈现时在查询下方的 T-SQL 注释中显示左侧的第二列)

当使用NVARCHAR(包括NCHAR和 should-never-be-used NTEXT)时,编码总是 UTF-16,因此字符集永远不会改变(它总是 Unicode,它是单个字符集)。在这种情况下,整理主要影响排序和比较(这里不做)。

如果您使用的是VARCHAR,则需要使用阿拉伯语归类来设置代码页以支持阿拉伯语字符(Windows 代码页 1256)。

您初始'????'返回的原因????是字符串文字没有前缀N,使其成为VARCHAR字符串,在这种情况下,它被转换为与您正在使用的当前数据库的默认排序规则相关联的代码页,这显然不是阿拉伯语整理。这种转换发生在最初解析查询时,这意味着您的字符串???? 转换操作将其转换为NVARCHAR. 如果您一直在使用具有阿拉伯语默认排序规则的数据库,那么即使没有N前缀,您的字符串文字也能正常工作,而CASTtoNVARCHAR也同样没有必要。

 
有关使用字符串/编码/Unicode/排序规则的更多信息,请访问我的网站:排序规则信息


PS 我建议您不要使用旧式 JOIN,例如FROM TableA, TableB WHERE TableA.JoinColumn = TableB.JoinColumn. 虽然该语法尚未被弃用,但相关的外连接语法 —*==*— 实际上已在 SQL Server 2005 中删除。因此,为了一致性(我个人也会考虑可读性),您应该改用该INNER JOIN子句。此外,最好在对象名称前加上其架构名称。最终结果是:

FROM dbo.TableA
INNER JOIN dbo.TableB
        ON TableB.JoinColumn = TableA.JoinColumn
Run Code Online (Sandbox Code Playgroud)

  • +1 的答案,但需要一个小的更正:旧式逗号连接没有并且可能永远不会被弃用,因为它是标准 SQL。已弃用的是非标准的旧样式外连接(`*=` 和 `=*`)。 (3认同)