如何在不知道列名的情况下进行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。这阻止我创建一个新的表与新的列名,因为我不能控制数据输入..

如何在不知道列名的情况下进行SQL搜索

你可以从一个简单的

开始
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
相关文章: