RIGHT 函数中的字符索引错误长度无效

问题描述 投票:0回答:1

我有一个与此类似的 SQL Server 视图:

SELECT
    BATCHID, BATCHNO,  OPENDATE, 
    RIGHT(LEFT(BATCHNO, LEN(BATCHNO) - LEN(RIGHT(BATCHNO, CHARINDEX('-', REVERSE(BATCHNO)) - 1)) - 1), CHARINDEX('-', REVERSE(LEFT(BATCHNO, LEN(BATCHNO) - LEN(RIGHT(BATCHNO, CHARINDEX('-', REVERSE(BATCHNO)) - 1)) - 1))) - 1)
    AS PRODUCTNAME
FROM TABLE_A

创建这样的结果:

巴奇德 批次号 开放日期 产品名称
1 X-ASDF-054 2023/01/02 航空自卫队
2 X-ASDF-033 2023/01/05 航空自卫队
3 X-QWER-056 2023/01/12 QWER

等等。

当我像这样查询表时

SELECT DISTINCT PRODUCTNAME, MIN(OPENDATE) AS MIN_OPENDATE 
FROM VIEW_X
GROUP BY PRODUCTNAME

一切都按预期进行。但是,当查询与此类似地嵌套时(由于我正在工作的受监管环境,我无法避免也无法影响):

SELECT PRODUCTNAME
FROM (
    SELECT DISTINCT PRODUCTNAME, MIN(OPENDATE) AS MIN_OPENDATE
    FROM VIEW_X
    GROUP BY PRODUCTNAME
) AS sub_query
WHERE PRODUCTNAME = 'ASDF'

我收到错误

传递给 RIGHT 函数的长度参数无效。

我不知道为什么也不知道如何解决。我可以影响如何创建视图和子查询,但无法影响函数的嵌套。我正在寻找一种解决方案,为我提供使用 PRODUCTNAME 列指定产品名称的所有条目。提前非常感谢!

sql sql-server subquery charindex
1个回答
0
投票

问题在于,您用来解析字符串中的各个部分的丑陋大表达式可能会针对该表达式失败的行运行(例如,没有

BATCHNO
字符的
-
)。

相反,请执行以下操作:

SELECT
BATCHID, BATCHNO,  OPENDATE, 
CASE WHEN BATCHNO LIKE N'%[-]%[-]%' THEN
RIGHT(LEFT(BATCHNO, LEN(BATCHNO) - LEN(RIGHT(BATCHNO, 
  CHARINDEX('-', REVERSE(BATCHNO)) - 1)) - 1), 
  CHARINDEX('-', REVERSE(LEFT(BATCHNO, 
  LEN(BATCHNO) - LEN(RIGHT(BATCHNO, CHARINDEX('-', 
  REVERSE(BATCHNO)) - 1)) - 1))) - 1) 
AS PRODUCTNAME
FROM dbo.TABLE_A;

当然,SQL Server 2016+ 中更简单的方法是(从这个伟大的答案中提取):

SELECT BATCHID, BATCHNO,  OPENDATE, 
  JSON_VALUE('["' + REPLACE(BATCHNO,'-','","') + '"]','$[1]')
  AS PRODUCTNAME
FROM dbo.TABLE_A;

示例位于 db<>fiddle

© www.soinside.com 2019 - 2024. All rights reserved.