为什么以下代码会提示LEN中的列名文本无效?SELECT SUBSTRING(文本, N, 4) AS 四字组合, COUNT(*) AS 出现次数 FROM [语料匹配清单].dbo.[接触流水与文本清单] as A INNER JOIN ( SELECT DISTINCT number AS N FROM master..spt_values WHERE number BETWEEN 1 AND LEN([文本]) - 1 ) AS B ON 1=1 GROUP BY SUBSTRING(文本, N, 4) ORDER BY 出现次数 DESC
时间: 2023-12-05 16:04:11 浏览: 95
这是因为在查询中使用了 `LEN([文本])`,而 `LEN` 函数需要指定一个列或者表达式作为参数,而不是一个列名。你需要使用类似于 `LEN(A.[文本])` 的语法来获取列 `[文本]` 的长度。修改后的代码如下:
```
SELECT SUBSTRING(文本, N, 4) AS 四字组合, COUNT(*) AS 出现次数
FROM [语料匹配清单].dbo.[接触流水与文本清单] as A
INNER JOIN (
SELECT DISTINCT number AS N
FROM master..spt_values
WHERE number BETWEEN 1 AND LEN(A.[文本]) - 1
) AS B ON 1=1
GROUP BY SUBSTRING(文本, N, 4)
ORDER BY 出现次数 DESC
```
相关问题
[语料匹配清单].dbo.[接触流水与文本清单]表中列名为文本,内容为中文与英文字符混合,请问在SQL SERVER中,如何罗列文本中以4个字符结合计算出现次数
您可以使用 SQL SERVER 的内置函数 SUBSTRING 和 LEN 来实现该功能。具体语法如下:
```
SELECT SUBSTRING(文本, 1, 4) AS 四字组合, COUNT(*) AS 出现次数
FROM [语料匹配清单].dbo.[接触流水与文本清单]
WHERE LEN(文本) >= 4
GROUP BY SUBSTRING(文本, 1, 4)
ORDER BY 出现次数 DESC;
```
其中,SUBSTRING 函数用于截取文本中的前 4 个字符作为一个组合;LEN 函数用于判断文本长度是否大于等于 4,以过滤掉不足 4 个字符的文本;COUNT 函数用于统计每个四字组合的出现次数;GROUP BY 子句用于按照四字组合进行分组;ORDER BY 子句用于按照出现次数降序排列结果。
WHILE @idx <= @len DO SET accinterval1 = TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(temp_accintervals, ',', @idx), ',', -1)); SELECT accinterval1; /** * 取卷内条目数 */ SELECT count( 1 ) INTO records FROM t_ams_recordother t WHERE t.archivesym = accinterval1 AND FONDSCODE = '2110000' AND bookid = 0 and classno in ('银行余额调节表','银行对账单'); select records ; IF records =0 then SELECT concat(accinterval1,' - 未查询到需要组卷的数据'); SET @idx = @idx + 1; CONTINUE; end if; SET @idx = @idx + 1; END WHILE;为什么continue在报错
根据你提供的代码,`CONTINUE` 的报错可能是因为 `CONTINUE` 关键字不能单独使用,必须在循环内部使用。在你的代码中,`CONTINUE` 语句的位置不在循环内部,导致报错。
你应该将 `CONTINUE` 语句放在 `WHILE` 循环内部的条件语句中,例如:
```
WHILE @idx <= @len DO
SET accinterval1 = TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(temp_accintervals, ',', @idx), ',', -1));
SELECT accinterval1;
/** 取卷内条目数 */
SELECT count( 1 ) INTO records FROM t_ams_recordother t WHERE t.archivesym = accinterval1 AND FONDSCODE = '2110000' AND bookid = 0 and classno in ('银行余额调节表','银行对账单');
SELECT records ;
IF records = 0 THEN
SELECT concat(accinterval1,' - 未查询到需要组卷的数据');
SET @idx = @idx + 1;
CONTINUE WHILE;
END IF;
SET @idx = @idx + 1;
END WHILE;
```
在上述代码中,`CONTINUE` 语句被放在了 `IF` 条件语句中,并且标明了 `WHILE` 循环的名称,以此来实现跳过本次循环。
阅读全文