Sql 如何查询固定位置表
我在sql server中有一个固定的位置表。这是一个两列的表格。一个主键,在查询和一列varchar4000中50个字段的其余部分中不需要或不有用。我想在表中选择三个不同的数据字段,并创建一个临时表来执行更多查询。字段用空格填充,所以所有变量都在文件中的相同位置。不知道从哪里开始,在这个话题上找不到太多Sql 如何查询固定位置表,sql,sql-server,Sql,Sql Server,我在sql server中有一个固定的位置表。这是一个两列的表格。一个主键,在查询和一列varchar4000中50个字段的其余部分中不需要或不有用。我想在表中选择三个不同的数据字段,并创建一个临时表来执行更多查询。字段用空格填充,所以所有变量都在文件中的相同位置。不知道从哪里开始,在这个话题上找不到太多 ;WITH CTE AS ( SELECT RowID , SUBSTRING(Bigfield, 4,6) field1 , SUBSTRING(B
;WITH CTE AS (
SELECT RowID
, SUBSTRING(Bigfield, 4,6) field1
, SUBSTRING(Bigfield, 11,2) field2
, SUBSTRING(Bigfield, 15,2) field3
FROM Table
)
SELECT C.*
FROM TableC
JOIN CTE ON C.RowID= CTE.RowID
WHERE CTE.field3 like '%re%'
丑陋,我同意将其导出并导入到真实结构中会更好,但如果需要,这里有一种方法。您处于不利位置,但这可能会使您走上将这些数据分解为您可以使用的内容的轨道,具体取决于您的分隔符格式。split函数来自,设计用于使用单字符分隔符。由于您使用的是固定宽度字段,因此可能需要修改函数以使其执行您想要执行的操作。因此,我将过滤掉示例数据中的大量空白行
create table ##data (id int identity, data varchar(4000))
insert into ##data (data) values ('some_text2 12 21 44 xxx')
insert into ##data (data) values ('some_text 10 20 40 xyz')
select id, split.pn, split.s
FROM ##data dt
CROSS APPLY dbo.Split(' ', dt.data) AS split
WHERE split.s != ''
CREATE FUNCTION dbo.Split(@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
好的。我发现这很有效,而且我不必导出和重新导入 挑选 子字符串REC,58,4+'/'+
SUBSTRING(rec,62,2) + '/' +
SUBSTRING(rec,64,2) as dDate,
(SUBSTRING(rec,132,3)) as dCounty
从tablename看,这是一个糟糕的设计。为什么要在一列中存储50个字段?您的表中不能有50个列吗?@Lamak-可能有50个字段实际上是属性,对于许多id可能为空。因此,每个id最多可以有50行。我在现实世界中看到过这一点,也就是在教科书之外。实际上,您将SQL Server表用作制表符分隔的文件。这是两个世界中最糟糕的。如果可能的话,为所有子数据创建合理类型的列。@BoratSagdiyev每个id 50行?,这不是op所说的。他/她说,他/她在一个数据库中存储了50列。这是一个可怕的错误design@vfiola-听起来像某种EDL格式。不过,我不明白为什么它必须作为一大块文本进入数据库。是否不可能在将其放入数据库之前对其进行解析,并使其结构更加合理?这将使查询变得更容易。