如何在不知道列名的情况下进行SQL搜索
本文关键字:情况下 SQL 搜索 不知道 | 更新日期: 2023-09-27 17:54:30
嗨,我有一个包含产品属性名和产品属性值的表。
有点像这样:
PAName1 PAValue1 PAName2 PAValue2 PAName3 PAName3 PAName4 PAName5
Height 6ft Length 186cm Weight 74kg Name John
Length 190cm Height 6ft Weight 83kg Name Mathew
Weight 55Kg Length 186cm Height 5.5ft Name Anthony
Name Peter Length 186cm Weight 74kg Height 6ft
如何选择高度为6英尺的行?
我知道如何使用In
命令,我可以选择所有PA来找到这个,但我正在寻找更好的解决方案,
只是想编辑的东西,我目前处理的数百万行,其中一些行有不同的产品属性。例如,有些行没有高度作为值,它们可能有国家。有些行什么都没有,只有Name。这阻止我创建一个新的表与新的列名,因为我不能控制数据输入..
你可以从一个简单的
开始SELECT * FROM table
WHERE (PAName1 = 'Height' AND PAValue1 = '6ft')
OR (PAName2 = 'Height' AND PAValue2 = '6ft')
...
OR (PAName5 = 'Height' AND PAValue5 = '6ft')
但是,更好的方法是将这些值存储在相应的列中。尝试将表重新设计为:
CREATE TABLE Persons
(
Id uniqueIdentifier,
Name varchar(255),
Height float,
Length float,
Weight float
);
不太清楚(至少对我来说)您的产品名称、属性和值是如何联系在一起的。我怀疑你的样品数据遗漏了产品名称。如果是这样,我会将其创建为实体-属性-值表。
试试这样写:
CREATE TABLE dbo.product_attributes
(
product_name VARCHAR(10) NOT NULL,
attribute VARCHAR(255) NOT NULL,
value VARCHAR(255) NULL
)
可以像SELECT * FROM dbo.product_attributes WHERE attribute = 'Height' AND value = '6ft'
好的,我没有测试,但是试试下面的
编辑;with p AS
(
SELECT COLUMN1,COLUMN2,LEFT(Height, len(Height)-2) AS HeightValue FROM YourTable
)
select * FROM p WHERE p.HeightValue ='6'
注意
len(Height)-2 to exclude the ft from the height value