SQL查询列中的更多信息

Posted

技术标签:

【中文标题】SQL查询列中的更多信息【英文标题】:SQL query for more information in column 【发布时间】:2019-08-20 15:29:44 【问题描述】:

我需要一些关于 SQL 查询的信息。这是我的 SQL 表;

CustomData 是我表中的列名。 CustomData 有更多列。 表示列中的列。 如果我使用这个查询;

SELECT CustomData FROM Entities

结果;

[
    
        "Name": "Telefon",
        "Value": "5417416039"
    ,
    
        "Name": "Adres",
        "Value": "AYDOĞAN MAH. 7.SOK. HACIHÜSEYİN APT. KAT:3 NO:6"
    
]

我想在 CustomData WHERE Name=Telefon 中获取值

我该怎么做?

已编辑

<?php

  header('Access-Control-Allow-Origin: *');
  header('Access-Control-Allow-Headers: X-Requested-With');
  header('Access-Control-Allow-Headers: Content-Type');
  header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE,PUT');

  $serverName = "x.x.x.x"; //serverName\instanceName
  $connectionInfo = array( "Database"=>"hidden","UID"=>"sa","PWD"=>"hidden", "CharacterSet" => "UTF-8");
  $consamba = sqlsrv_connect( $serverName, $connectionInfo);

  $sql3 = "SELECT CustomData FROM Entities WHERE EntityTypeId='1'";
  $result3 = sqlsrv_query($consamba,$sql3);
  $json = array();
  while($row3 = sqlsrv_fetch_array($result3,SQLSRV_FETCH_ASSOC))
      $json[] = $row3;
  
  echo json_encode($json);


 ?>

【问题讨论】:

用您正在使用的数据库和版本标记您的问题。另外,解释CustomData 的数据类型。它看起来像 JSON。 预期输出是什么? Telefon 的价值观 @kalemteknoloji 您的 SQL Server 版本是多少? CustomData 中的数据是有效的 JSON 数组,因此您需要将此数据解析为 JSON。谢谢。 SQL Express 2014 我该如何解析,请帮帮我 【参考方案1】:

原始答案(适用于 SQL Server 2016+):

CustomData 列中的数据似乎是有效的JSON 数组,因此一种可能的方法是使用OPENJSON()JSON_VALUE() 解析此数据(SQL Server 2016 中引入了JSON 支持)。当您将OPENJSON() 与默认架构一起使用时,结果是一个包含keyvaluetype 列的表,因此您需要包含额外的CROSS APPLY 运算符来解析JSON 数组中的每个项目。

表:

CREATE TABLE Entities (
   EntityTypeId varchar(1),
   CustomData nvarchar(max)
)
INSERT INTO Entities
   (EntityTypeId, CustomData)
VALUES ('1', N'[
    
        "Name": "Telefon",
        "Value": "5417416039"
    ,
    
        "Name": "Adres",
        "Value": "AYDOĞAN MAH. 7.SOK. HACIHÜSEYİN APT. KAT:3 NO:6"
    
]')

PHP:

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE,PUT');

$serverName = "x.x.x.x";
$connectionInfo = array("Database"=>"hidden", "UID"=>"sa", "PWD"=>"hidden", "CharacterSet" => "UTF-8");
$consamba = sqlsrv_connect($serverName, $connectionInfo);
if ($consamba === false) 
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;


$sql3 = "
    SELECT
        e.CustomData,
        JSON_VALUE(j.[value], '$.Value') AS Telefon
    FROM Entities e
    CROSS APPLY OPENJSON(e.CustomData) j
    WHERE
        EntityTypeId = '1' AND
        JSON_VALUE(j.[value], '$.Name') = N'Telefon'
";
$result3 = sqlsrv_query($consamba, $sql3);
if ($result3 === false) 
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;


$json = array();
while ($row3 = sqlsrv_fetch_array($result3, SQLSRV_FETCH_ASSOC))
    $json[] = $row3["Telefon"];

echo json_encode($json);

sqlsrv_free_stmt($result3);
sqlsrv_close($consamba);
?>

更新:

SQL Server 2014 不支持JSON,因此一种可能的方法是使用json_decode() 解析PHP 部分中的JSON 数据:

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE,PUT');

$serverName = "x.x.x.x";
$connectionInfo = array("Database"=>"hidden", "UID"=>"sa", "PWD"=>"hidden", "CharacterSet" => "UTF-8");
$consamba = sqlsrv_connect($serverName, $connectionInfo);
if ($consamba === false) 
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;


$sql3 = "SELECT CustomData FROM Entities";
$result3 = sqlsrv_query($consamba, $sql3);
if ($result3 === false) 
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;


$json = array();
while ($row3 = sqlsrv_fetch_array($result3, SQLSRV_FETCH_ASSOC))
    $decoded = json_decode($row3["CustomData"], true);
    foreach($decoded as $item) 
        if ($item["Name"] == "Telefon") 
            $json[] = $item["Value"];
           
       

echo json_encode($json);

sqlsrv_free_stmt($result3);
sqlsrv_close($consamba);
?>

【讨论】:

错误 (sqlsrv_query): Array ([0] => Array ([0] => 42000 [SQLSTATE] => 42000 [1] => 195 [code] => 195 [2] = > [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'JSON_VALUE' 不是可识别的内置函数名称。[消息] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]' JSON_VALUE' 不是可识别的内置函数名称。)) @kalemteknoloji SQL Server 不支持 JSON。请参阅更新的答案。谢谢。【参考方案2】:

类似这样的:

declare @entities table (id int, customdata nvarchar(max))
insert  into @entities(id,customdata)
values (1,'
[
    
        "Name": "Telefon",
        "Value": "5417416039"
    ,
    
        "Name": "Adres",
        "Value": "AYDOĞAN MAH. 7.SOK. HACIHÜSEYİN APT. KAT:3 NO:6"
    
]')

select e.id, c.Value Telefon
from @entities e
cross apply openjson(e.customdata) 
            with( 
                   Name nvarchar(200) '$.Name',
                   value nvarchar(200) '$.Value'
                 ) c
where c.name = N'Telefon'

【讨论】:

请检查我的编辑,因为我不明白你的答案。【参考方案3】:
Select CustomData

From Entities

Where CustomData LIKE '%Telefon%'

会让你走得很远

【讨论】:

以上是关于SQL查询列中的更多信息的主要内容,如果未能解决你的问题,请参考以下文章

使用联合向 SQL 查询添加更多表

如何存储和调用表列中的 sql 查询?

oracle数据库之SQL结构化查询语言

Oracle SQL 计算某列中的不同值

SQL 查询:如何通过自己列中的“任何”检索结果?

SQL - 查询字符串是不是包含列中的部分值