AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 290340
Accepted
abdou31
abdou31
Asked: 2021-04-24 02:22:49 +0800 CST2021-04-24 02:22:49 +0800 CST 2021-04-24 02:22:49 +0800 CST

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

  • 772

我的 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
sql-server collation
  • 2 2 个回答
  • 752 Views

2 个回答

  • Voted
  1. Solomon Rutzky
    2021-04-24T08:58:30+08:002021-04-24T08:58:30+08:00

    由于您使用的是 Unicode / UTF-16 (ie 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- رجوع
    

    (该-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子句。此外,最好在对象名称前加上其 Schema 名称。最终结果是:

    FROM dbo.TableA
    INNER JOIN dbo.TableB
            ON TableB.JoinColumn = TableA.JoinColumn
    
    • 6
  2. Best Answer
    J.D.
    2021-04-24T02:35:06+08:002021-04-24T02:35:06+08:00

    在这种情况下,因为您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:

    SELECT
        case 
            when (CAST(o.startTime as time(7)) > cast(Start as time(7))) then  cast(N'قدوم' COLLATE Arabic_CI_AI_KS_WS as varchar(55)) 
            else cast(N'رجوع' COLLATE Arabic_CI_AI_KS_WS as varchar(55)) end as stat,
        userId, 
        FirstName 
    from Users,TimeTable
    
    • 3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve