AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

Como criar uma nova coluna no SELECT CASE quando a string contém palavras em árabe?

  • 772

Estou com um problema com um select case when statement, gostaria de adicionar uma nova coluna no select case when statement, obtive o resultado mas com ?????porque configurei a coluna para palavras arábicas, tentei converter o conteúdo de a nova coluna nvarchar(55)infelizmente, obtive o mesmo resultado.

Como posso obter o resultado correto?

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 respostas
  • 752 Views

2 respostas

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

    Como você está usando Unicode / UTF-16 (ou seja NVARCHAR), você não precisa do CASTou mesmo de um Arabic_*agrupamento. O único requisito para literais de string é prefixá-los com "N" maiúsculo:

    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 -o-campo é usado como separador para evitar que a formatação Bi-Direction, inerente aos pontos de código árabe e hebraico, exiba a segunda coluna à esquerda no comentário T-SQL abaixo da consulta quando renderizada em HTML)

    Ao usar NVARCHAR(incluindo NCHARe o should-never-be-used NTEXT), a codificação é sempre UTF-16, portanto, o conjunto de caracteres nunca muda (é sempre Unicode, que é um conjunto de caracteres único). Nesse caso, o agrupamento afeta principalmente a classificação e as comparações (o que não está sendo feito aqui).

    Se você estivesse usando VARCHAR, seria necessário um agrupamento em árabe para definir a página de código para oferecer suporte aos caracteres árabes (página de código do Windows 1256).

    A razão pela qual sua inicial 'قدوم'retornou ????é que a string literal não foi prefixada com N, tornando-a uma VARCHARstring, nesse caso ela foi convertida para a página de código associada ao agrupamento padrão do banco de dados atual que você estava usando, que claramente não era um árabe agrupamento. Essa conversão acontece quando a consulta é analisada inicialmente, o que significa que sua string já estava ???? antes da operação de conversão convertê-la em NVARCHAR. Se você estivesse usando um banco de dados que tivesse um agrupamento padrão em árabe, seu literal de string funcionaria mesmo sem o Nprefixo, e o CASTto NVARCHARseria igualmente desnecessário.

     
    Para obter mais informações sobre como trabalhar com strings/codificações/Unicode/collations, visite meu site: Collations Info


    PS Eu recomendaria que você não fizesse JOINs de estilo antigo, como FROM TableA, TableB WHERE TableA.JoinColumn = TableB.JoinColumn. Embora essa sintaxe não tenha sido preterida, a sintaxe de junção externa relacionada — *=e =*— na verdade foi removida no SQL Server 2005 . Portanto, para consistência (e pessoalmente, eu também adicionaria legibilidade), você deve usar a INNER JOINcláusula. Além disso, é sempre melhor prefixar os nomes dos objetos com o nome do Schema. O resultado final é:

    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

    Nesse caso, porque você está usando um NVARCHARtipo de dados em sua conversão que dá suporte a todo o conjunto de caracteres Unicode , tudo o que está faltando no prefixo da string ad-hoc é o Ncaractere para significar para o SQL Server tratar a string como NVARCHAR, nesse ponto torna sua CAST()chamada de função redundante e também não é necessária. Por exemplo SELECT N'Some Text', irá produzir uma NVARCHARstring ao invés de apenas SELECT 'Some Text'que produz uma VARCHARstring.

    A resposta de Solomon Rutzky também fornece um exemplo claro disso, com informações mais perspicazes.


    Para quem se deparar com esse problema ao usar VARCHARtipos de dados (ou semelhantes), abaixo estão os droids que você está procurando :

    Você precisa usar um caractere árabe com suporte para agrupamento na coluna, para a tabela, no banco de dados ou no nível de instância do servidor, como Arabic_CI_AI_KS_WS.

    Esta resposta do StackOverflow tem boas informações sobre ela.

    Para consultas e valores ad hoc, você deve poder usar a COLLATEfunção conforme necessário. Por exemplo, com sua consulta acima, se precisávamos usar 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

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve