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 / 316647
Accepted
John
John
Asked: 2022-09-09 07:54:54 +0800 CST2022-09-09 07:54:54 +0800 CST 2022-09-09 07:54:54 +0800 CST

Ao encontrar uma substring, encontre também a posição final

  • 772

Uma LIKEcláusula pode testar se uma string ocorre em outra e a CHARINDEXfunção pode fornecer a posição inicial da primeira correspondência.

No meu caso, estou interessado na posição final , que é, devido aos meandros dos agrupamentos, não derivável do local inicial. Por exemplo, em um agrupamento alemão ( German_PhoneBook_100_CI_AS_SC_UTF8),

  • häocorre em 'Häger' na posição 1 e termina na posição 2 e
  • häocorre em 'Haeger' na posição 1 e termina na posição 3.

O problema disso é marcar a parte correspondente de um texto de resultado de pesquisa para o benefício dos usuários.

Eu estive pensando em inverter as cordas, mas ainda posso obter apenas a primeira correspondência CHARINDEXe, nesse caso invertido, precisaria da última.

Alguma ideia alguém?

sql-server collation
  • 2 2 respostas
  • 98 Views

2 respostas

  • Voted
  1. Best Answer
    John
    2022-09-09T08:31:21+08:002022-09-09T08:31:21+08:00

    A seguir está uma nova tentativa que acredito funcionar, mas é muito mais hacky do que a primeira que foi postada nesta resposta.

    Com base na ideia de usar replace, mas tendo que lidar com o fato de que replacesubstitui tudo e não apenas a primeira ocorrência, agora substituo as correspondências por algo contendo um separador identificável que posso encontrar charindexpara separar o resto. Eu posso então remover o resto e ver o comprimento do resto.

    No entanto, vamos fazer as seguintes suposições para tornar nossa vida um pouco mais fácil, ela fica complicada o suficiente mesmo com essas restrições em vigor:

    1. Supõe-se que a string de pesquisa esteja no início da fonte a ser pesquisada. Este é o caso que eu realmente preciso para o meu problema, mas uma solução mais geral provavelmente também existe.
    2. O caractere de separação não está na fonte. No meu caso, posso escolher um caractere exótico e viver com esse recurso não funcionando para aquela string rara em que realmente ocorre. (Eu verifico primeiro, é claro.)
    3. Para não precisar especificar o agrupamento em todo o lugar na consulta, presumo que a consulta seja executada em um banco de dados com agrupamento German_PhoneBook_100_CI_AS_SC_UTF8 - certifique-se de fazer o mesmo ou adicionar os especificadores de agrupamento ao executar isso.

    Primeiro, aqui está uma versão programática:

    declare @sep char(1) = '|'
    declare @source varchar(60) = 'haegerhae'
    declare @tofind varchar(60) = 'hä'
    
    declare @helper varchar(61) = concat(@tofind, @sep)
    
    declare @temp varchar(60) = replace(@source, @tofind, @helper)
    declare @l int = charindex(@sep, @temp, 1)
    
    select @temp temp, left(@source, @l) [match];
    

    O restante mostra como hae, que também nos informa a posição final por seu comprimento.

    Aqui está a expressão embutida:

    select left(@source, charindex(@sep, replace(@source, @tofind, concat(@tofind, @sep)), 1)) [match]
    
    • 1
  2. Michael Green
    2022-09-10T14:53:31+08:002022-09-10T14:53:31+08:00

    CHARINDEX dará o dardo de uma partida. Use STUFF para inserir @sep. Isso vai quebrar a partida. Avance um lugar de cada vez até que a partida seja restaurada. Isso dará o fim da fonte.

    haeger   match at position 1   
    h|aeger  no match    
    ha|eger  no match    
    hae|ger  match    
    

    Assim, a partida se estende da posição 1 à 3 inclusive.

    Se houver várias correspondências na string original, isso será exibido após a primeira vez que @sep for preenchido. Nesse caso, o original pode ser truncado de lá e pesquisado dessa maneira.

    Não posso digitar isso corretamente no momento. Talvez amanhã. Espero que seja útil mesmo assim.

    • 1

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