标签: substring

更改 SQL Server 2016 中包含 SUBSTRING() 的谓词的估计值?

是否有关于 SQL Server 2016 中关于如何估计包含 SUBSTRING() 或其他字符串函数的谓词的基数的更改的任何文档或研究?

我问的原因是我正在查看一个在兼容模式 130 下性能下降的查询,原因与与包含对 SUBSTRING() 调用的 WHERE 子句匹配的行数估计值的变化有关。我通过查询重写更正了这个问题,但我想知道是否有人知道有关 SQL Server 2016 中该领域更改的任何文档。

演示代码如下。在这个测试案例中,估计值非常接近,但准确度因数据而异。

在测试用例中,在兼容级别 120 中,SQL Server 似乎使用直方图进行估计,而在兼容级别 130 中,SQL Server 似乎假定表的固定 10% 匹配。

CREATE DATABASE MyStringTestDB;
GO
USE MyStringTestDB;
GO
DROP TABLE IF EXISTS dbo.StringTest;
CREATE TABLE dbo.StringTest ( [TheString] varchar(15) );
GO
INSERT INTO dbo.StringTest
VALUES
( 'Y5_CLV' );
INSERT INTO dbo.StringTest
VALUES
( 'Y5_EG3' );
INSERT INTO dbo.StringTest
VALUES
( 'ZY_NE' );
INSERT INTO dbo.StringTest
VALUES
( 'ZY_PQT' );
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization substring sql-server-2016 cardinality-estimates

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

为什么基于 SQL 的数据库服务器上的字符串函数从位置 1 而不是 0 开始?

这一直困扰着我。基于 SQL 的服务器中的字符串函数似乎总是从位置 1 开始(至少 MySQL、SQL Server、Oracle 和 Postgres 是这种情况)。例如,以下查询将用于选择名称数据库中名为 first_name 的列的第一个字母:

SELECT SUBSTRING(first_name,1,1) FROM names;
Run Code Online (Sandbox Code Playgroud)

为什么字符串函数的位置不像几乎所有编程语言的规范那样从 0 开始?

我正在寻找的不仅仅是 ANSI 标准。为什么是标准?

编辑:好的,所以 0 不是“几乎所有编程语言中的规范”,正如下面所指出的。1 也被使用。

functions string substring

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

是否存在最长公共子串问题的 SQL Server 实现?

是否存在最长公共子串问题的 SQL Server 实现?在 SQL Server 中检查列的所有行的解决方案?我见过将两个字符串作为输入的解决方案,但没有查看表中列的所有行的 SQL Server 解决方案。

我确实尝试了一些东西,但老实说,我认为目前有一个解决方案超出了我的脑海,因此欢迎提出任何建议。

这里没有“现实世界”问题,我只是在研究编程问题以及如何使用 SQL Server 解决这些问题。

performance sql-server substring query-performance

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

如何使用 PostgreSQL 计算锚定字符串的出现次数?

如果我在这样的表中的行的列中有一个字符串

1 2 2 2 2 2 2
Run Code Online (Sandbox Code Playgroud)

我如何计算字符串2中子字符串的出现次数。假设除了空格分隔符 之外没有其他任何内容" "

为此,我们将数字视为子字符串

样本数据

CREATE TABLE foo
  AS
    SELECT 1 AS id, '1 2 2 2 2 2 2'::text AS data;

TABLE foo
 id |     data      
----+---------------
  1 | 1 2 2 2 2 2 2
Run Code Online (Sandbox Code Playgroud)

postgresql count string substring

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

没有前 n 个字符的子串

我正在开发一个 SQL Server 2016 存储过程,我想获取varchar(38)列的最后一个字符。

我知道总会有至少 18 个字符,我不知道列的确切长度,因为它是可变的。

我想我可以得到列的长度并做一个减法来使用SUBSTRING,但我不能这样做,因为我正在这样做:

set @externalCodes = (
    select Serial, AggregationLevel
      from ExternalCode where ProductionOrderId = @productionOrderId
    for json path
Run Code Online (Sandbox Code Playgroud)

我正在生成一个 JSON,但我不知道如何获取Serial选择中每列的长度。

我的问题是:如何在不知道长度的情况下从没有前 18 个字符的字符串中获取子字符串?

一种解决方案可能是:

SUBSTRING(Serial, 18, 38)
Run Code Online (Sandbox Code Playgroud)

并且它总是返回从 18 到字符串末尾的子字符串,即使字符串的长度不是 38。

sql-server t-sql substring sql-server-2016

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

MSSQL:从前缀号生成 8 位序列号/条形码号

我面前有一项复杂的任务,我真的可以用你的一些大脑来帮助我。

在我的工作中,我们有一个存储条形码数字的数据库。该表包含 6 位数字作为 8 位条形码的前缀,我们目前是否在 Excel 中手动计算条形码的最后 2 位数字。

以下是我们如何手动计算最后 2 位数字的步骤:

条码前缀示例:

declare @prefix int
set @prefix = 573071
Run Code Online (Sandbox Code Playgroud)

1)每个前缀应生成 10 次,其中第 7 位数字从 0 自动递增到 9

5730710
5730711
5730712 
5730713
5730714
5730715
5730716
5730717
5730718
5730719
Run Code Online (Sandbox Code Playgroud)

2)加上第 7 位数字后,我们使用以下公式计算每行的第 8 位数字:

sql-server t-sql substring

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

在查找子串时,也要查找结束位置

子句LIKE可以测试某个字符串是否出现在另一个字符串中,并且该CHARINDEX函数可以给出第一个匹配的开始位置。

\n

就我而言,我对结束位置感兴趣,由于排序规则的复杂性,它无法从开始位置推导出来。例如,在德语排序规则 ( German_PhoneBook_100_CI_AS_SC_UTF8) 中,

\n
    \n
  • h\xc3\xa4出现在 'H\xc3\xa4ger' 的位置 1 处,结束于位置 2 处
  • \n
  • h\xc3\xa4出现在“Haeger”中的位置 1 并结束于位置 3。
  • \n
\n

这样做的问题是为了用户的利益标记搜索结果文本的匹配部分。

\n

我一直在考虑反转字符串,但我仍然只能得到第一个匹配项CHARINDEX,在反转的情况下我需要最后一个匹配项。

\n

有人有什么想法吗?

\n

sql-server collation substring

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

从绝对位置提取没有扩展名的文件名

我正在尝试获取包含在我的表的特定列的值中的文件名。我的桌子看起来像这样:

absolutel_path
\\Path\filename.extension
Run Code Online (Sandbox Code Playgroud)

我需要filenameabsolute_path( \\Path\filename.extension) 中提取文件名(在上面)。我应该使用哪个函数来获取我的文件名(子字符串)?

substring

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

试图检查一个字符串是否只包含一个数字

我一直在尝试编写一个函数来检查一个字符串是否包含一个数字,而该数字不是更大数字的一部分(换句话说,如果要搜索的数字是 '6' 而字符串是 '7+16+2'它应该返回 false,因为这个字符串中的 '6' 是数字 '16' 的一部分)

我写了下面的函数(它很长,但我打算在重构之前先测试它)

在测试时,我发现了一个错误,它仅通过逻辑运行找到的数字的第一个实例。因此,使用 '6' 对 '16+7+9+6' 运行此函数将返回 false,因为它确定第一个 '6' 是更大数字的一部分并停止处理。

我认为要解决这个问题,我必须实现一个循环来缩短 'haystack' 字符串(这样,使用示例 '16+7+9+6',该函数在消除后继续检查 '+7+9+6'第一个“6”)但在花时间使已经复杂的函数变得更加复杂之前,我想检查是否有更简单的方法来实现相同的目标?

drop function dbo.runners_contain_runner
go
create function dbo.runners_contain_runner(@runner varchar(max), @runners varchar(max))
returns int
as 
begin

    /*
    eliminate the plus sign from @runners so that the 
    'isnumeric' function doesn't return false positives (it returns 1 for '+') 
    */
    set @runners = replace(@runners,'+','_' ) 


    declare @ret int;
    set @ret = 0;

    -- if the runner is the only runner return …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server t-sql pattern-matching substring

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

如何简化多列 SQL Server where 子句中的重复变量

我知道必须有更好的方法来针对多列评估一组重复变量。我已经搜索了一段时间,但仍然没有很好的解决方案。有一个更好的方法吗?

SELECT *
FROM TABLE
WHERE 
  (SUBSTRING(COLUMN1,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30)  
OR SUBSTRING(COLUMN2,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30)  
OR SUBSTRING(COLUMN3,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30)  
OR SUBSTRING(COLUMN4,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30)  
OR SUBSTRING(COLUMN5,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30))   
...REPEATS 5 MORE TIMES
Run Code Online (Sandbox Code Playgroud)

sql-server substring

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

从 xml 列中提取整数值

我只是想知道如何从 XML 列中提取一个整数。目前所有的数字都是 4,下面的查询可以做到。但是这个数字很快就会增长到 10,000 个,这意味着 5 位数,这个查询将无法做到。无论如何,我是否可以动态地从 Xml 列的中间<siteID>和中间取出任何整数</siteID>。任何建议将不胜感激。

SELECT 
SUBSTRING(msg, patindex('%[0-9][0-9][0-9][0-9]</siteID>%',msg),4)  AS DOMAIN
FROM table  a(NOLOCK)
WHERE msg like '<DLR%'
ORDER BY 1 DESC
Run Code Online (Sandbox Code Playgroud)

xml sql-server t-sql substring

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

Postgres 中有没有更简洁的方法来提取字符串的一部分?

我正在使用 Postgres 9.5。我有一个表,其中有一列记录 URL。有时 URL 具有查询字符串,有时则没有。我想提取 URL,减去任何查询字符串,所以我想出了:

select substring(url, 0, case position('?' in url) when 0 then length(url)+1 else position('?' in url) end) 
from article;
Run Code Online (Sandbox Code Playgroud)

这看起来有点罗嗦,我想知道是否有更简洁的方法来做到这一点。我的表列是类型TEXT

postgresql select string substring

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

在列中拆分和复制字符串值的单一查询方法

这是我之前问题的一部分。

我有以下逻辑从表中的列中拆分字符串值tblProjects,如下所示:

SELECT  @Docs = Documents FROM tblProjects WHERE ID = @ID 
SET @Docs = @Docs + '$'
SET @pos = 0
SET @len = 0

WHILE CHARINDEX('$', @Docs, @pos + 1)>0
BEGIN
  SET @len = CHARINDEX('$', @Docs, @pos + 1) - @pos
  SET @value = SUBSTRING(@Docs, @pos, @len)

  IF CHARINDEX('|', @value) >0
  BEGIN
    SELECT  @type = SUBSTRING(@value, 1, CHARINDEX('|', @value) - 1),
            @name = SUBSTRING(@value, CHARINDEX('|', @value) + 1, 200)
    INSERT INTO tblDocuments VALUES(@ID, @value, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server substring

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