Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何查询固定位置表_Sql_Sql Server - Fatal编程技术网

Sql 如何查询固定位置表

Sql 如何查询固定位置表,sql,sql-server,Sql,Sql Server,我在sql server中有一个固定的位置表。这是一个两列的表格。一个主键,在查询和一列varchar4000中50个字段的其余部分中不需要或不有用。我想在表中选择三个不同的数据字段,并创建一个临时表来执行更多查询。字段用空格填充,所以所有变量都在文件中的相同位置。不知道从哪里开始,在这个话题上找不到太多 ;WITH CTE AS ( SELECT RowID , SUBSTRING(Bigfield, 4,6) field1 , SUBSTRING(B

我在sql server中有一个固定的位置表。这是一个两列的表格。一个主键,在查询和一列varchar4000中50个字段的其余部分中不需要或不有用。我想在表中选择三个不同的数据字段,并创建一个临时表来执行更多查询。字段用空格填充,所以所有变量都在文件中的相同位置。不知道从哪里开始,在这个话题上找不到太多

;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格式。不过,我不明白为什么它必须作为一大块文本进入数据库。是否不可能在将其放入数据库之前对其进行解析,并使其结构更加合理?这将使查询变得更容易。