标签: string-manipulation

从具有多个分隔符和位置的字符串中提取街道地址

试图从这些数据中提取街道地址:

CREATE TABLE foo(Places varchar(50));
INSERT foo(Places) VALUES
('MARKET @123 NORTH RD'),
('HARDWARE @600 Main RD ;W1'),
('MAIN AV / NORTH RD'),
('500 NORTH RD @LIBRARY'),
('500 ANYSTREET ; *** SIDEWALK****'),
('MARKET @123 NORTH RD'),
('700 ANYSTREET'),
('(088.12345,088.12345) ;75 SOUTH RD');
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用 CASE、SUBSTRING 和 (CHAR/PAT)INDEX ......但我只是没有正确地做到这一点。

Select 
[Address] = CASE WHEN PATINDEX('%@[0-9]%' , Places) = 0 THEN     (SUBSTRING(Places, 0, CHARINDEX('@',Places)))
                WHEN PATINDEX('%@[a-z]%' , Places) = 0 THEN     (SUBSTRING(Places, CHARINDEX('@',Places) + 1, LEN(Places)))
                WHEN PATINDEX('%;[0-9]%' , Places) = 0 THEN (SUBSTRING(Places, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server string-manipulation

5
推荐指数
1
解决办法
2198
查看次数

查看哪个模式匹配单个单词的有效方法

我正在创建一个函数来找出最适合单个字符串的搜索模式。要匹配的字符串将与可能有数百种可能模式的表格进行比较,以查看它是否与其中任何一种匹配。

我现在有一个不太优雅的函数,它可以将所有模式读入内存表并遍历它们以查看每个模式是否匹配。它有效,但想到在生产环境中使用它让我感到恶心,尤其是当模式表增长到数千个模式时。

要匹配的示例字符串:'Master'

可能的模式:

  1. 先生
  2. abc%
  3. xyz%
  4. A B C D

结果将与模式#1 匹配。

在这个场景中,我需要能够匹配潜在的部件号、品牌和其他可能拼错的短语。我正在合并 Double Metaphone,但是当涉及到只有一个模式才能捕捉到的其他项目时,我需要知道哪些模式是匹配的。“StringToSearch”只会返回 1 个匹配的模式。

有没有人有理论或其他代码类型可以帮助我完成这个反向模式匹配过程?

sql-server pattern-matching sql-server-2016 string-manipulation

4
推荐指数
1
解决办法
471
查看次数

如何用多行数据替换字符串的多个部分?

给定一个包含两列的表 - 一个整数 ID 和一个基于文本的字符串 - 我想从一个字符串值开始,该字符串值对用大括号括起来的任意数量的整数进行编码,并与任何其他有效文本字符混合。

例子:'{1} / {9} ... {12}'

通过一条SELECT语句,我想返回一个字符串,其中所有整数(及其大括号)都已替换为从我的表派生的值;具体来说,行的文本值的 ID 与源字符串中找到的数字相匹配......并且大括号之外的任何字符保持不变。

这是一个未能完成任务的示例:

select
  replace('{13} {15}','{'+cast(id as varchar)+'}',isNull(display,''))
from testing;
Run Code Online (Sandbox Code Playgroud)

这将在表中每行返回 1 行testing。对于值 = 13 的行id,字符串的“{13}”部分已成功替换,但“{15}”部分未成功替换(第 15 行反之亦然)。

我想创建一个循环所有testing行并重复尝试替换的函数可以解决问题。尽管如此,直接的 SQL 语句比循环语句更好。

示例数据

+----+-------------------+
| id |  display          |
+----+-------------------+
|  1 |  Apple            |
|  2 |  Banana           |
|  3 |  Celery           |
|  4 |  Dragonfruit      |
|  5 |  Eggplant         |
| …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2016 string-manipulation

4
推荐指数
1
解决办法
8046
查看次数

用特殊字符替换一组连续的数字

我有一个varchar(200)列,其中包含诸如,

ABC123124_A12312 ABC123_A1212 ABC123124_B12312 AC123124_AD12312 A12312_123 等等..

我想用一个数字替换一个数字序列,*以便我可以对表格中的不同非数字模式进行分组。

这个集合的结果是 ABC*_A* ABC*_B* AC*_AD* A*_*

我在下面编写了以下原始查询,它可以正常工作,但是在一张大表上运行需要很长时间。

我需要帮助重写或编辑它以提高它的性能。SQL Server 2014

-- 1. replace all numeric characters with '*'
-- 2. replace multiple consecutive '*' with just a single '*'
SELECT REPLACE
        (REPLACE
             (REPLACE
                  (REPLACE
                       (REPLACE
                            (REPLACE
                                 (REPLACE
                                      (REPLACE
                                           (REPLACE
                                                (REPLACE
                                                     (REPLACE
                                                          (REPLACE
                                                               (REPLACE(SampleID, '0', '*'),
                                                                '1', '*'),
                                                           '2', '*'),
                                                      '3', '*'),
                                                 '4', '*'),
                                            '5', '*'),
                                       '6', '*'),
                                  '7', '*'),
                             '8', '*'),
                        '9', '*')
                  , '*', '~*') -- replace each …
Run Code Online (Sandbox Code Playgroud)

sql-server pattern-matching sql-server-2014 string-manipulation query-performance

3
推荐指数
1
解决办法
1025
查看次数

在数据库中查找特定单词

目标

在数据库中的表中定位特定单词并在列表中显示表和列的名称。

问题

有太多表无法定位数据库中的特定单词。

信息

  • 使用 SQL Server 2012
  • 每个表都使用一个“schemaname.tablename”

sql-server t-sql sql-server-2012 string-manipulation

2
推荐指数
1
解决办法
2212
查看次数

删除前导和尾随引号

我有一个可能以引号开头和结尾的字段。如果字符串以引号开头和结尾,我只想删除引号。如果字符串中存在引号,那么我希望保留它们。

REVERSE如果该字段确实以引号开头和结尾,我已经使用了一些有用的东西,但如果不是,则它只返回空值。

如果字段结果不是以引号开头,我如何确保我仍然获得字段结果?

我拥有的:

REVERSE(STUFF(REVERSE(STUFF(fieldname, CHARINDEX('"', fieldname), LEN('"'), '')), CHARINDEX('"', REVERSE(STUFF(fieldname, CHARINDEX('"', fieldname), LEN('"'), '')), 1), 1, ''))
Run Code Online (Sandbox Code Playgroud)

sql-server query t-sql sql-server-2016 string-manipulation

2
推荐指数
2
解决办法
1256
查看次数

如何使用 PostgreSQL 更改层次结构树中的字符串输出?

我有一张这样的表:

-------------------------------------------------
|  id  | description         | parent_id   |  cost
--------------------------------------------------
| 1    |  Radiology         |       NULL  | 0.00
| 2    |  Lab Tests         |       NULL  | 0.00
| 3    |  Normal Radiology  |         1   | 0.00
| 4    |  Resonance         |         1   | 100.00
| 1100 |  Cerebral Resonance|         4   | 200.00
| 1900 |  Blood Tests       |         2   | 10.00
| 2044 |  Calcium           |         2   | 50.00

---------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我需要生成这种输出:

Radiology
   -->Normal Radiology
   -->Resonance
      -->Cerebral Resonance with contrast …
Run Code Online (Sandbox Code Playgroud)

postgresql cte recursive string-manipulation

2
推荐指数
1
解决办法
158
查看次数

如何将一个值连接到通过 sql 查询检索到的数组?

我有一个名为“mkvtable”的表,它在各个字符串和字符串数组之间建立对应关系:

  词| MKV字
------+-----------------
 你好 | {世界,朋友}
 再见| {家,永远}
 你好| {伙计们,女士们}

根据PostgreSQL 提供的文档,将值附加到值数组应该是使用连接运算符“||”的简单问题。

但是,如果我尝试将字符串 , 添加到与单词 对应的there字符串数组中,则似乎不会发生任何情况:{fellas,ladies}hi

SELECT mkvword FROM mkvtable WHERE word = 'hi' || 'there';
Run Code Online (Sandbox Code Playgroud)

PostgresSQL 似乎也说了同样的话:

 mkvword
---------
(0 rows)
Run Code Online (Sandbox Code Playgroud)

由于没有抛出任何错误,我认为语法上没有问题。

我究竟做错了什么?我最好的猜测是 psql 感到不安,因为我试图通过使用数组与相邻列中的值的关系来访问数组,但这只是一个未经教育的猜测。也许这种查询与连接运算符不太适合?

TL;DR:如何正确地将值连接到表行中存储的数组?

postgresql array string-manipulation

1
推荐指数
1
解决办法
2387
查看次数

从 nvarchar 列查找并显示特殊字符代码

我想知道我的 type 列中有哪些特殊字符(换行符、制表符等)nvarchar。我知道如何选择哪些行包含特定字符

例如SELECT * FROM your_table WHERE your_column LIKE '%' + CHAR(10) + '%'

但是,我想知道哪些列包含不在其中的字符[a-zA-Z0-9],然后知道哪些列包含其中的字符。我还查看了是否可以在列上进行选择以显示显示所有字符的原始文本(例如类似于 Microsoft Word 的显示所有字符),但我也找不到如何执行此操作。

sql-server string-manipulation sql-server-2019

1
推荐指数
1
解决办法
2742
查看次数

与 NULL 值连接(不应替换 NULL)

经过一段时间寻找答案后,我收到了很多问题,说要使用coalesceconcat()等,但我需要的是:

桌子:

create table nulos ( nome varchar(max))
alter table nulos add cidade varchar(max)
Run Code Online (Sandbox Code Playgroud)

价值观:

insert into nulos values ( 'rafael','são paulo'),('juliana',null)
Run Code Online (Sandbox Code Playgroud)

我需要将这个表中的值连接到一个插入中,如下所示:

 select 'insert into nulos (nome,cidade) values ('+nome+','+cidade+')'
from nulos
Run Code Online (Sandbox Code Playgroud)

和选择的结果:

insert into nulos (nome,cidade) values (rafael,são paulo)
NULL
Run Code Online (Sandbox Code Playgroud)

如何在此串联中使用 NULL 值?每个答案都说用''or替换空值'_',但我需要的是:

insert into nulos (nome,cidade) values (rafael,são paulo)

insert into nulos (nome,cidade) values (Juliana,NULL)
Run Code Online (Sandbox Code Playgroud)

SET CONCAT_NULL_YIELDS_NULL on 不是一个选项,因为它只是删除 NULL 值,我需要插入它。

null sql-server sql-server-2008-r2 string-manipulation

0
推荐指数
1
解决办法
4528
查看次数

即使与另一个列值部分匹配,也将特定字符串替换为空白

我有一个场景,如果部分单词与另一列匹配,则从一组逗号分隔的字符串中替换整个字符串。

我发现用文字解释非常复杂,因此我通过包含各种示例的屏幕截图进行了解释。

请帮助我使用存储过程或函数或查询来获取所需结果列中的结果,如下面的屏幕截图所示。

截屏

我尝试使用STRING_SPLIT函数来分割值并连接表。我对解决这个问题的逻辑感到震惊。

sql-server string-manipulation

0
推荐指数
1
解决办法
207
查看次数