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()
与默认架构一起使用时,结果是一个包含key
、value
和type
列的表,因此您需要包含额外的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查询列中的更多信息的主要内容,如果未能解决你的问题,请参考以下文章